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