Использование Unity вместо ASP.Net Core DI IServiceCollection

Все больше и больше библиотек.NET Core привязаны к IServiceCollection. В качестве примера я хочу использовать HttpClientFactory описанную здесь, в моей.NET Framework 4.7.1. настольного приложения. Мое приложение использует Unity IoC. Я ссылался на Microsoft.Extensions.Http как NuGet.

Но есть проблема: новые компоненты ASP.Net Core привязаны к инфраструктуре 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, но я застрял, когда хочу зарегистрировать DefaultHttpMessageHandlerBuilder и DefaultHttpClientFactory которые имеют внутреннюю видимость. Поэтому они недоступны для регистрации вне кода MS.

У меня есть шанс решить эту ситуацию?

+1
источник поделиться
2 ответа

У вас есть 2 варианта:

+3
источник

Основываясь на ответе @davidfowl, я использовал свое второе решение и код:

Эти пакеты должны быть указаны из моего проекта (фрагмент из.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>

И вот тест, который сервисы ServiceCollection можно разрешить из контейнера Unity:

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

        }

    }
}
+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос