繁体   English   中英

Microsoft Dependency Injection和HttpClientFactory w / .NET Framework 4.6+ / MVC 5.2 / Web API 2

[英]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

基于我已经完成的读取,似乎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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM