Внедрение зависимостей Microsoft и HttpClientFactory с .NET Framework 4.6+ / MVC 5.2 / Web API 2 - PullRequest
4 голосов
/ 21 июня 2019

Наше веб-приложение построено на .NET Framework 4.6+.Мы используем WebForms, MVC 5.2 и Web API 2.

Я пытаюсь интегрировать Microsoft.Extensions.DependencyInjection и Microsoft.Extensions.Http в это решение, чтобы мы могли воспользоватьсяновый HttpClientFactory, который находится в ASP.NET Core.Мы также хотим начать использовать DI в наших контроллерах MVC и API.

Похоже, что этого можно достичь двумя способами:

  • Создать собственный ControllerActivator
  • Напишите пользовательский DependencyResolver

Исходя из прочитанного мною чтения, кажется, что метод ControllerActivator является старым способом сделать это, а DependencyResolver является текущим, предпочтительным способом обработки этого.Я написал код для обоих, и оба метода, кажется, работают.

Учитывая, что DependencyResolver сейчас кажется предпочтительным решением для DI, я бы хотел использовать его, но я не уверен, что я 'm правильно обрабатывает удаление объекта области действия.

Вот как я настраиваю DependencyResolvers в Global.asax:

Web.Mvc.DependencyResolver.SetResolver(New Mvc.DependencyInjection.DependencyResolver(serviceProvider))
GlobalConfiguration.Configuration.DependencyResolver = New Api.DependencyInjection.DependencyResolver(serviceProvider)

Моя реализация System.Web.Http.Dependencies.IDependencyResolver для веб-API:

public class DependencyResolver : IDependencyResolver
{
    private IServiceProvider ServiceProvider { get; }

    public DependencyResolver(IServiceProvider serviceProvider) => ServiceProvider = serviceProvider;

    public IDependencyScope BeginScope() => new DependencyResolver(ServiceProvider.CreateScope().ServiceProvider);

    public void Dispose() => (ServiceProvider as IDisposable)?.Dispose();

    public object GetService(Type serviceType) => ServiceProvider.GetService(serviceType);

    public IEnumerable<object> GetServices(Type serviceType) => ServiceProvider.GetServices(serviceType);
}

Моя реализация System.Web.Mvc.IDependencyResolver для MVC:

public class DependencyResolver : IDependencyResolver
{
    private IServiceProvider ServiceProvider { get; }

    public DependencyResolver(IServiceProvider serviceProvider) => ServiceProvider = serviceProvider;

    public object GetService(Type serviceType) => ServiceProvider.GetService(serviceType);

    public IEnumerable<object> GetServices(Type serviceType) => ServiceProvider.GetServices(serviceType);
}

Интерфейс System.Web.Http.Dependencies.IDependencyResolver имеет Dispose(), и, похоже, запросы API действительно вызывают мойметод утилизации реализации.Так что, похоже, работает (я думаю).

Меня беспокоит то, что System.Web.Mvc.IDependencyResolver интерфейс не имеет Dispose(), я не уверен, правильно ли эти сервисные объекты удаляются после запроса MVC.

Если кто-нибудь может дать некоторое представление об этом, я действительно ценю это.Не хочу раскатывать это и узнавать, что у нас утечка памяти.

1 Ответ

0 голосов
/ 24 июня 2019

После долгих исследований и дискуссий мы склоняемся к гибридному решению этой проблемы.

Для контроллеров API, поскольку System.Web.Http.Dependencies.IDependencyResolver предоставляет способ избавиться отСервисный контейнер / поставщик (и объекты, которые он создает), мы будем использовать описанный выше подход Dependency Resolver.

Для контроллеров MVC мы используем подход активации контроллера, разработанный Стивеном Ваном.Здесь: ASP.NET Dependency Injection Scoped время жизни

Я создал фиктивную службу, которая реализует IDisposable, и подтвердил, что Dispose вызывается с использованием обоих подходов DI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...