を最後にConfigureServices.cs
services.AddSingleton<IRepositoryResolver, RepositoryResolver>();
services.AddTransient<TestSuiteRepository>();
services.AddTransient<BaseRepository>();
任意のクラスでそれを使用して
public interface IRepositoryResolver
{
IRepository GetRepositoryByName(string name);
}
public class RepositoryResolver : IRepositoryResolver
{
private readonly IServiceProvider _serviceProvider;
public RepositoryResolver(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public IRepository GetRepositoryByName(string name)
{
if(name == "TestSuiteRepository")
return _serviceProvider.GetService<TestSuiteRepositor>();
//... other condition
else
return _serviceProvider.GetService<BaseRepositor>();
}
}
登録に必要なサービス:
リポジトリリゾルバを作成します。例は以下のようなものでなければなりません@ adem-caglinの回答に追加私はここにいくつかの再利用可能なタラを掲載したい私は名前ベースの登録のために作成しました。
更新日これはnuget packageとして入手可能です。あなたはStartup
クラスに次のコードを追加する必要がありますあなたのサービスを登録するために
:
services.AddTransient<ServiceA>();
services.AddTransient<ServiceB>();
services.AddTransient<ServiceC>();
services.AddByName<IService>()
.Add<ServiceA>("key1")
.Add<ServiceB>("key2")
.Add<ServiceC>("key3")
.Build();
次にあなたがIServiceByNameFactory
インタフェースを介して、それを使用することができます。
public AccountController(IServiceByNameFactory<IService> factory) {
_service = factory.GetByName("key2");
}
全拡張子のコードはgithubです。
ユニットテストでIoCを使用する必要はありません。統合テストの場合は、radu-mateiのように複数のスタートアップクラスを使用する必要があります – Tseng
ビジネスの一部である単体テストではありませんlogic =)TestSuiteはビジネスエンティティ –
解決策を探している人は、[this nuget package](https: /www.nuget.org/packages/Neleus.DependencyInjection.Extensions) – neleus