【问题标题】:Use IServiceCollection extensions with DryIoc将 IServiceCollection 扩展与 DryIoc 一起使用
【发布时间】:2020-08-13 13:06:46
【问题描述】:

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

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

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

我的问题:有没有办法在我的其他项目中使用它。也许通过从 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
    }
}

【问题讨论】:

    标签: c# asp.net-core dependency-injection dryioc


    【解决方案1】:

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

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

    更新:

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

    【讨论】:

    • 是的,这正是我的两个想法。第一个是可能的,但非常难看,因为AddHttpClient 中有太多注册。第二种方法我也检查过。默认情况下它没有注册,但我认为有可能。唯一就是不知道会不会有什么不好的副作用。明天试试这个。
    • 不,似乎不起作用。注册仅在已解析的IServiceCollection 实例中完成。在此之后,它们不再是 DryIoC 容器的一部分。或者我做错了。
    【解决方案2】:

    我能够通过使用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>();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-21
      • 2021-06-11
      • 2021-06-05
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      相关资源
      最近更新 更多