代码之家  ›  专栏  ›  技术社区  ›  Lasse V. Karlsen

使用HostBuilder.ConfigureServices用干燥的容器?

  •  3
  • Lasse V. Karlsen  · 技术社区  · 7 年前

    DryIoc . 也就是说 服务注册 是紧密结合的,而不是实际的服务。

    如果可以的话,我宁愿不去改变代码,如果我不需要。

    创建新的ASP.NETMVC核心应用程序通过更改ConfigureServices方法返回 IServiceProvider

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().AddControllersAsServices();
    
        var container = new Container().WithDependencyInjectionAdapter(services);
        return container.ConfigureServiceProvider<CompositionRoot>();
    }
    

    (这是来自内存,因此可能不是100%正确,但这并不重要)

    void 方法可以更改为返回 IServiceProvider DryIoc 你能给我提供。

    然而,与 HostBuilder ,我想用于控制台应用程序、后台服务等。配置服务的方法不接受 IServiceProvider服务器 所以我不知道怎么做。

    var builder = new HostBuilder()
        .ConfigureAppConfiguration((hostingContext, config) => { ... })
        .ConfigureServices((hostContext, services) =>
        {
            services.AddOptions();
            // configure services
        })
        .ConfigureLogging((hostingContext, logging) => { ... });
    

    这个 ConfigureServices 上面的方法有一个重载和一个扩展方法:

    • ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate)
    • ConfigureServices(this IHostBuilder hostBuilder, Action<IServiceCollection> configureDelegate)

    似乎没有任何关于归还或使用信用卡的规定 IServiceProvider服务器 干细胞 在这方面可以为我提供帮助。

    这可能吗?有办法缩小差距吗?还是我必须改用微软 IServiceCollection 为了我的类库?因为它们在许多项目中都有使用,所以我不想仅仅因为在这个特定的实例中看起来最简单就改变它们,但是如果我必须这样做,我必须这样做。

    1 回复  |  直到 7 年前
        1
  •  5
  •   Lasse V. Karlsen    7 年前

    答案是不正确的(但在ASP.NET应用程序),由提供 @Nkosi UseServiceProviderFactory 这就是解决办法,所以谢谢你们。

    使用 我必须自己实现一个类,并将适当的nuget包引用添加到我的项目中。

    1. 添加对的引用 DryIoc.dll (毫不奇怪)
    2. 添加对的引用 DryIoc.Microsoft.DependencyInjection
    3. 更改注册码
    4. 使用ServiceProviderFactory

    原始代码如下所示:

    var builder = new HostBuilder()
        .ConfigureAppConfiguration((hostingContext, config) => { ... })
        .ConfigureServices((hostContext, services) =>
        {
            services.AddOptions();
            // configure services
        })
        .ConfigureLogging((hostingContext, logging) => { ... });
    

    var builder = new HostBuilder()
        .ConfigureAppConfiguration((hostingContext, config) => { ... })
        .ConfigureServices((hostContext, services) =>
        {
            services.AddOptions();
            // configure services
        })
    
        //////////////////// ADD THIS vvvvvvvv
        .UseServiceProviderFactory(new DryIocServiceProviderFactory())
        .ConfigureContainer<Container>((hostContext, container) =>
        {
            container.Register<...>();
        })
        //////////////////// ADD THIS ^^^^^^^^
    
    
        .ConfigureLogging((hostingContext, logging) => { ... });
    

    然后提供 DryIocServiceProviderFactory :

    internal class DryIocServiceProviderFactory : IServiceProviderFactory<IContainer>
    {
        public IContainer CreateBuilder(IServiceCollection services)
            => new Container().WithDependencyInjectionAdapter(services);
    
        public IServiceProvider CreateServiceProvider(IContainer containerBuilder)
            => containerBuilder.ConfigureServiceProvider<CompositionRoot>();
    }
    

    CompositionRoot 上面的类在配置期间解析,构造函数可用于配置容器。不能使用不执行任何操作的伪类。

    推荐文章