[英]Microsoft Dependency Injection & HttpClientFactory w/ .NET Framework 4.6+ / MVC 5.2 / Web API 2
我们的Web应用程序基于.NET Framework 4.6+构建。 我们正在使用WebForms,MVC 5.2和Web API 2。
我正在尝试将Microsoft.Extensions.DependencyInjection和Microsoft.Extensions.Http集成到此解决方案中,以便我们可以利用ASP.NET Core中的新HttpClientFactory。 我们还想在我们的MVC和API控制器中开始使用DI。
看来有两种方法可以实现:
基于我已经完成的读取,似乎ControllerActivator方法是执行此操作的旧方法,而DependencyResolver是当前处理此方法的首选方法。 我已为两者编写代码,两种方法似乎都有效。
考虑到DependencyResolver现在似乎是DI的首选解决方案,我想使用它,但我不确定我是否正确处理范围对象处理。
以下是我在Global.asax中配置DependencyResolvers的方法:
Web.Mvc.DependencyResolver.SetResolver(New Mvc.DependencyInjection.DependencyResolver(serviceProvider))
GlobalConfiguration.Configuration.DependencyResolver = New Api.DependencyInjection.DependencyResolver(serviceProvider)
我对Web API的System.Web.Http.Dependencies.IDependencyResolver实现是:
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);
}
我对MVC的System.Web.Mvc.IDependencyResolver实现是:
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请求会调用我的实现的Dispose方法。 所以这似乎有效(我认为)。
我担心的是System.Web.Mvc.IDependencyResolver
接口没有Dispose()
,我不清楚这些服务对象是否在MVC请求之后正确处理。
如果有人能提供一些洞察力,我真的很感激。 不想推出这个,发现我们正在泄漏记忆。
经过大量的研究和讨论,我们倾向于针对这个问题采用混合解决方案。
对于API控制器,由于System.Web.Http.Dependencies.IDependencyResolver提供了一种处理服务容器/提供程序(以及它创建的对象)的方法,我们将使用上面列出的依赖性解析程序方法。
对于MVC控制器,我们将采用Steven van Deursen在此处设计的Controller Activation方法: ASP.NET依赖注入生命周期
我创建了一个实现IDisposable的虚拟服务,并确认使用两种DI方法调用Dispose。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.