我如何使用Castle作为IOC,而不是默认的.net核心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使用这个解析器作为IServiceCollection的替代品。
发布于 2017-12-06 14:07:00
对于其他人,除了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;
}
}在创业的时候。
public IServiceProvider ConfigureServices(IServiceCollection services) {
services.AddMvc();
// Add other framework services
// Add custom provider
var container = new ServiceResolver(services).GetServiceProvider();
return container;
}发布于 2017-12-06 13:29:11
对于以DI为中心的.net核心,您需要创建自己的包装器。
参考资料:介绍ASP.NET核心中的依赖项注入:替换默认的服务容器
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;
}在运行时,您的容器将用于解析类型和注入依赖项。
发布于 2018-05-25 14:43:53
有一个官方的城堡温莎支持的ASP.NET核心已经发布为版本5(从nuget Castle.Windsor,Castle.Facilities.AspNetCore获得它)。如何使用它的文档是这里。
https://stackoverflow.com/questions/47672614
复制相似问题