1. ホーム
  2. c#

[解決済み] ASP.NET Core内蔵のDIコンテナでサービス登録の置き換え?

2023-06-09 08:45:01

質問

のサービス登録について考えてみましょう。 Startup.ConfigureServices :

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IFoo, FooA>();
}

を変更することは可能ですか? IFoo への登録は可能ですか? FooBAddTransient が呼び出された後ですか?これはテスト目的で役に立つことがあります (たとえば TestStartup サブクラス)、またはコードベースへのアクセスが制限されている場合に役立ちます。

もし、別の IFoo の実装になります。

services.AddTransient<IFoo, FooA>();
services.AddTransient<IFoo, FooB>();

次に GetService<IFoo>FooB の代わりに FooA :

IFoo service = services.BuildServiceProvider().GetService<IFoo>();
Assert.True(service is FooB);

しかし GetServices<IFoo> は両方の実装を正常に返します(同じように GetService<IEnumerable<IFoo>> ):

var list = services.BuildServiceProvider().GetServices<IFoo>().ToList();
Assert.Equal(2, list.Count);

そこには Remove(ServiceDescriptor) メソッドがあります。 IServiceCollection という契約をしています。をどうすればいいのでしょうか? ServiceDescriptor を使用してサービス登録を変更できますか?

どのように解決するのですか?

これは、単純に Replace(IServiceCollection, ServiceDescriptor) メソッドから ServiceCollectionDescriptorExtensions クラスで使用されます。

// IFoo -> FooA
services.AddTransient<IFoo, FooA>();

// Replace
// IFoo -> FooB
var descriptor =
    new ServiceDescriptor(
        typeof(IFoo),
        typeof(FooB),
        ServiceLifetime.Transient);
services.Replace(descriptor);

も参照してください。