Использование Unity вместо ASP.Net Core DI IServiceCollection - PullRequest
0 голосов
/ 05 июня 2018

Все больше библиотек .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 code и хотел вручную зарегистрировать соответствующие интерфейсы и классы в Unity.Вот как службы регистрируются IServiceCollection:

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

Это не будет проблемой, чтобы переместить это в Unity IoC, но я застрял, когда я хочу зарегистрировать DefaultHttpMessageHandlerBuilder и DefaultHttpClientFactory, которые имеют внутренняя видимость.Поэтому они не доступны для регистрации за пределами кода MS.

Есть ли у меня какой-либо шанс, как разрешить эту ситуацию?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Основываясь на ответе @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());

        }

    }
}
0 голосов
/ 06 июня 2018

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

...