首页 文章

使用 Unity 而不是 ASP.Net Core DI IServiceCollection

提问于
浏览
2

越来越多.NET 核心库被绑定到IServiceCollection。在示例中,我想在我的.NET Framework 4.7.1 中使用HttpClientFactory描述这里。桌面应用。我的应用程序使用的是 Unity IoC。我引用了Microsoft.Extensions.Http作为 NuGet。

但是有一个问题:新的 ASP.Net 核心组件绑定到 Microsoft DI 框架.NetCore - IServiceCollection。例如,HttpClientFactory的注册在这里:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient();
}

我正在深入MS 代码并希望手动向 Unity 注册相应的接口和类。这是 IServiceCollection 注册服务的方式:

services.TryAddTransient<HttpMessageHandlerBuilder, DefaultHttpMessageHandlerBuilder>();
services.TryAddSingleton<IHttpClientFactory, DefaultHttpClientFactory>();

将此移至 Unity IoC 是没有问题的,但是当我想注册具有内部可见性的DefaultHttpMessageHandlerBuilderDefaultHttpClientFactory时,我被困住了。因此,它们不能在 MS 代码之外注册。

我有机会如何解决这种情况吗?

2 回答

  • 4

    你有 2 个选择:

  • 4

    基于 on_3_answer,我使用了他的第二个解决方案并完成了代码:

    这些包需要从我的项目中引用(来自.csproj 的片段):

    <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Http">
          <Version>2.1.1</Version>
        </PackageReference>
        <PackageReference Include="Unity.Microsoft.DependencyInjection">
          <Version>2.0.10</Version>
        </PackageReference>
      </ItemGroup>
    

    以下是可以从 Unity 容器解析 ServiceCollection 服务的测试:

    using System;
    using System.Linq;
    using System.Net.Http;
    using Microsoft.Extensions.DependencyInjection;
    using Unity;
    using Unity.Microsoft.DependencyInjection;
    using Xunit;
    
    namespace FunctionalTests
    {
        public class UnityWithHttpClientFactoryTest
        {
    
            /// <summary>
            /// Integration of Unity container with MS ServiceCollection test
            /// </summary>
            [Fact]
            public void HttpClientCanBeCreatedByUnity()
            {
                UnityContainer unityContainer = new UnityContainer();
    
                ServiceCollection serviceCollection = new ServiceCollection();
                serviceCollection.AddHttpClient("Google", (c) =>
                {
                    c.BaseAddress = new Uri("https://google.com/");
                });
                serviceCollection.BuildServiceProvider(unityContainer);
    
                Assert.True(unityContainer.IsRegistered<IHttpClientFactory>());
                IHttpClientFactory clientFactory = unityContainer.Resolve<IHttpClientFactory>();
                HttpClient httpClient = clientFactory.CreateClient("Google");
    
                Assert.NotNull(httpClient);
                Assert.Equal("https://google.com/", httpClient.BaseAddress.ToString());
    
            }
    
        }
    }
    

相关问题