Castle Windsorをデフォルトの.netコアIOCコンテナの代わりにIOCとして使用するにはどうすればよいですか?
サービスを解決するためにWindsorContainer
に依存するサービスリゾルバーを構築しました。
何かのようなもの:
public class ServiceResolver
{
private static WindsorContainer container;
public ServiceResolver()
{
container = new WindsorContainer();
// a method to register components in container
RegisterComponents(container);
}
public IList<T> ResolveAll<T>()
{
return container.ResolveAll<T>().ToList();
}
}
私の.netコア2 Web APIがこのリゾルバーをIServiceCollectionの代わりとして使用する方法を理解できません。
Nkosiが提供したソリューションに加えて、その他の参考資料。
Castle.Windsor.MsDependencyInjection と呼ばれるnugetパッケージがあり、次のメソッドを提供します。
WindsorRegistrationHelper.CreateServiceProvider(WindsorContainer,IServiceCollection);
返される型はIServiceProvider
であり、独自のラッパーを作成する必要はありません。
そのため、ソリューションは次のようになります。
public class ServiceResolver{
private static WindsorContainer container;
private static IServiceProvider serviceProvider;
public ServiceResolver(IServiceCollection services) {
container = new WindsorContainer();
//Register your components in container
//then
serviceProvider = WindsorRegistrationHelper.CreateServiceProvider(container, services);
}
public IServiceProvider GetServiceProvider() {
return serviceProvider;
}
}
and inStartup...
public IServiceProvider ConfigureServices(IServiceCollection services) {
services.AddMvc();
// Add other framework services
// Add custom provider
var container = new ServiceResolver(services).GetServiceProvider();
return container;
}
IServiceProvider
を中心にDIを配置する.netコアの場合、独自のラッパーを作成する必要があります。
参照: ASP.NET Coreの依存性注入の概要:デフォルトサービスコンテナーの置き換え
public class ServiceResolver : IServiceProvider {
private static WindsorContainer container;
public ServiceResolver(IServiceCollection services) {
container = new WindsorContainer();
// a method to register components in container
RegisterComponents(container, services);
}
public object GetService(Type serviceType) {
return container.Resolve(serviceType);
}
//...
}
ConfigureServices
でコンテナを構成し、IServiceProvider
を返します。
サードパーティのDIコンテナを使用する場合、
ConfigureServices
の代わりにIServiceProvider
を返すようにvoid
を変更する必要があります。
public IServiceProvider ConfigureServices(IServiceCollection services) {
services.AddMvc();
// Add other framework services
// Add custom provider
var container = new ServiceResolver(services);
return container;
}
実行時に、コンテナを使用して型を解決し、依存関係を注入します。
バージョン5としてリリースされたASP.NET Coreの公式のCastle Windsorサポートがあります(nuget Castle.Windsor 、 Castle.Facilities.AspNetCore から入手してください)。使用方法のドキュメントは here です。