簡體   English   中英

將 IServiceCollection 擴展與 DryIoc 一起使用

[英]Use IServiceCollection extensions with DryIoc

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

我的場景是我在Startup.csConfigureServices方法中注冊一般的東西,其中IServiceCollection用於注冊服務。 僅在特定項目中需要的所有內容都在相應項目的擴展方法中注冊,但由於 DryIoc 容器必須集成到 ASP .NET 核心項目中,因此使用了 DryIoc IContainer

現在我有一個只在特定項目中需要的 HttpClient。 因此,我想將它的注冊放在相應的項目中。 問題是我想為它使用通常只能與 IServiceCollection 一起使用的 AddHttpClient。

我的問題:有沒有辦法在我的其他項目中使用它。 也許通過從 DryIoc 容器或其他東西中獲取它。

這是所描述文件的一般結構:

啟動.cs

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

程序.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);
}

SomeProject 中的ContainerSetup.cs

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>();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM