CodeGo.net>与DryIoc容器使用HostBuilder.ConfigureServices?

我有一些类库为我创建的应用程序提供服务,并且由于遗留原因,它们紧密地绑定到DryIoc.也就是说,服务注册是紧密绑定的,而不是实际的服务.

如果可以的话,我宁愿不要在不需要的情况下四处更改代码.

创建一个新的ASP.NET MVC Core应用程序,我能够通过更改ConfigureServices方法以返回IServiceProvider来使用DryIoc,如下所示:

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(操作< HostBuilderContext,IServiceCollection> configureDelegate)
> ConfigureServices(此IHostBuilder hostBuilder,操作< IServiceCollection> configureDelegate)

在这方面,似乎没有任何规定可以返回或使用IServiceProvider或DryIoc可以为我提供的任何其他服务.

这可能吗?有没有办法弥合差距?还是只需要对类库使用Microsoft IServiceCollection?由于在许多项目中都在使用它们,因此我不想因为在特定情况下看起来最简单而进行更改,但是如果必须的话,我必须更改.

解决方法:

@Nkosi提供了一个不正确的答案(但在ASP.NET应用程序的上下文中是正确的),并且注释线程引发了关于方法UseServiceProviderFactory的讨论,该方法原来是解决方案,所以谢谢大家.

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

步骤如下:

>添加对DryIoc.dll的引用(毫不奇怪)
>添加对DryIoc.Microsoft.DependencyInjection的引用
>更改注册码
>提供UseServiceProviderFactory所需框架的自定义实现

原始代码如下所示:

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类在配置过程中已解决,并且构造函数可用于配置容器.可以使用不执行任何操作的伪类.

上一篇:STC8H开发(七): I2C驱动MPU6050三轴加速度+三轴角速度检测模块


下一篇:C#-DryIoc.WebApi设置