将 IServiceCollection 扩展与 DryIoc 一起使用

Use IServiceCollection extensions with DryIoc

IServiceCollection 有很多扩展 - 在我的例子中,我使用 AddHttpClient

我的方案是在 Startup.cs 中的 ConfigureServices 方法中注册一般内容,其中 IServiceCollection 用于注册服务。仅在特定项目中需要的所有内容都在相应项目的扩展方法中注册,但由于 DryIoc 容器必须集成到 ASP .NET Core 项目中,因此使用了 DryIoc IContainer .

现在我有了一个只在特定项目中需要的HttpClient。因此,我想将它的注册放在各自的项目中。问题是我想为其使用 AddHttpClient,我通常只能与 IServiceCollection 一起使用。

我的问题:有没有办法在我的其他项目中使用它。也许通过从 DryIoc 容器或其他东西获取它。

这是所描述文件的一般结构:

Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.RegisterSomeService();
        // register other stuff
    }
}

Program.cs

public class Startup
{
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .UseServiceProviderFactory(new DryIocServiceProviderFactory())
            .ConfigureContainer<Container>(SomeProject.ContainerSetup.Initialize);
}

ContainerSetup.cs 在 SomeProject

public static class ContainerSetup
{
    public static void Initialize(HostBuilderContext hostContext, IContainer container)
    {
        container.Register<SomeService>();
        // register other stuff
        // here I want to use AddHttpClient
    }
}

我建议查看 AddHttpClient https://source.dot.net/#Microsoft.Extensions.Http/DependencyInjection/HttpClientFactoryServiceCollectionExtensions.cs,72bc67c4aadb77fc

并可能使用 IContainer 而不是服务集合进行相同的注册。

更新:

另一个想法是将IServiceCollection注册到自身(或者它可能已经自动注册了?),然后从IContainer和AddHttpClient解析它..

我能够使用 IContainer 扩展 Populate 解决问题,它是 DryIoc.Microsoft.DependencyInjection.

的一部分

我用它编辑了我的 ContainerSetup.cs 如下

public static class ContainerSetup
{
    public static void Initialize(HostBuilderContext hostContext, IContainer container)
    {        
        var services = new ServiceCollection();
        
        services.AddHttpClient<MyTypedClient>()
            .Configure[...];
        
        container.Populate(services); // with this call all services registered above will be registered in the container
        
        // register other stuff if necessary
        container.Register<SomeService>();
    }
}