首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >温莎IoC在ASP.net内核2中的应用

温莎IoC在ASP.net内核2中的应用
EN

Stack Overflow用户
提问于 2017-12-06 10:56:26
回答 4查看 17.2K关注 0票数 26

我如何使用Castle作为IOC,而不是默认的.net核心IOC容器?

我已经构建了一个依赖于WindsorContainer来解析服务的服务解析器。

类似于:

代码语言:javascript
复制
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的替代品。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-12-06 14:07:00

对于其他人,除了Nkosi提供的解决方案外,还有其他参考。

有一个名为Castle.Windsor.MsDependencyInjection的nuget包,它将为您提供以下方法:

代码语言:javascript
复制
WindsorRegistrationHelper.CreateServiceProvider(WindsorContainer,IServiceCollection);

返回的类型是IServiceProvider,您不需要创建自己的包装器。

因此,解决办法将是:

代码语言:javascript
复制
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;
    }    
}

在创业的时候。

代码语言:javascript
复制
public IServiceProvider ConfigureServices(IServiceCollection services) {
    services.AddMvc();
    // Add other framework services

    // Add custom provider
    var container = new ServiceResolver(services).GetServiceProvider();
    return container;
}
票数 21
EN

Stack Overflow用户

发布于 2017-12-06 13:29:11

对于以DI为中心的.net核心,您需要创建自己的包装器。

参考资料:介绍ASP.NET核心中的依赖项注入:替换默认的服务容器

代码语言:javascript
复制
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

代码语言:javascript
复制
public IServiceProvider ConfigureServices(IServiceCollection services) {
    services.AddMvc();
    // Add other framework services

    // Add custom provider
    var container = new ServiceResolver(services);
    return container;
}

在运行时,您的容器将用于解析类型和注入依赖项。

票数 12
EN

Stack Overflow用户

发布于 2018-05-25 14:43:53

有一个官方的城堡温莎支持的ASP.NET核心已经发布为版本5(从nuget Castle.WindsorCastle.Facilities.AspNetCore获得它)。如何使用它的文档是这里

有关问题这里这里的更多信息

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47672614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档