将IServiceCollection扩展与DryIoc一起使用

问题描述

IServiceCollection有很多扩展名-在我的情况下,我使用AddHttpClient

我的情况是我在ConfigureServices的{​​{1}}方法Startup.cs方法注册常规内容,其中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中解决它。.

,

我使用DryIoc.Microsoft.DependencyInjectionIContainer扩展名Populate来解决了这个问题。

使用它,我如下编辑了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>();
    }
}