web-dev-qa-db-ja.com

ASP.Net Core Dependency Injectionでサービスを削除する

Asp.Net MVCコア(初期バージョン、バージョン1.0または1.1)では、依存関係注入バインディングはStartup.csクラスで次のように構成されます。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IMyService, MyService>();
        // ...
    }
}

私のアプリケーションでは、通常、基本的なスタートアップクラスがあり、ジェネリックバインディングはこれらの行のシーケンスとして定義されています。

public abstract class BaseStartup
{
    public virtual void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IMyService1, MyService1>();
        services.AddScoped<IMyService2, MyService2>();
    }
}

次に、アプリケーションでスタートアップクラスを継承し、他のサービスも注入します。

public class Startup : BaseStartup
{
    public override void ConfigureServices(IServiceCollection services)
    {
        base.ConfigureServices(services);

        services.AddScoped<IMyService3, MyService3>();
        services.AddScoped<IMyService4, MyService4>();
    }
}

私は今疑問に思います:以前のバインディングをどのように「オーバーライド」することができますか?たとえば、次のように、基本クラスで定義されているバインディングを削除または変更します。

services.Remove<IMyService1>(); // Doesn't exist
services.AddScoped<IMyService1, MyBetterService1>();

または単にバインディングを更新します:

services.AddScoped<IMyService1, MyBetterService1>(replacePreviousBinding: true); // Doesn't exist either !

それを行う方法はありますか?または、単に以前に定義されたバインディングと同じインターフェースで新しいバインディングを宣言すると、そのバインディングがオーバーライドされますか?

13
kall2sollies

通常のコレクションAPIを使用して、サービスを削除できます。

services.AddScoped<IService>();

var serviceDescriptor = services.FirstOrDefault(descriptor => descriptor.ServiceType == typeof(IService));
services.Remove(serviceDescriptor);

また、同じことを実現する拡張メソッドを作成することもできます。

public static class ServiceCollectionExtensions
{
    public static IServiceCollection Remove<T>(this IServiceCollection services)
    {
        var serviceDescriptor = services.FirstOrDefault(descriptor => descriptor.ServiceType == typeof(T));
        if (serviceDescriptor != null) services.Remove(serviceDescriptor);

        return services;
    }
}
28
Andrii Litvinov