gpt4 book ai didi

asp.net - Microsoft 依赖注入(inject)和 HttpClientFactory w/.NET Framework 4.6+/MVC 5.2/Web API 2

转载 作者:行者123 更新时间:2023-12-03 14:55:49 24 4
gpt4 key购买 nike

我们的 Web 应用程序基于 .NET Framework 4.6+ 构建。我们正在使用 WebForms、MVC 5.2 和 Web API 2。

我正在尝试将 Microsoft.Extensions.DependencyInjection 和 Microsoft.Extensions.Http 集成到此解决方案中,以便我们可以利用 ASP.NET Core 中的新 HttpClientFactory。我们还想开始在我们的 MVC 和 API Controller 中使用 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接口(interface)有 Dispose() ,并且似乎 API 请求确实调用了我的实现的 Dispose 方法。所以这似乎有效(我认为)。

    我关心的是 System.Web.Mvc.IDependencyResolver接口(interface)没有 Dispose() ,我不清楚这些服务对象是否在 MVC 请求后被正确处理。

    如果有人可以对此提供一些见解,我将不胜感激。不想推出它并发现我们正在泄漏内存。

    最佳答案

    经过大量的研究和讨论,我们倾向于使用混合解决方案来解决这个问题。

    对于 API Controller ,由于 System.Web.Http.Dependencies.IDependencyResolver 提供了一种处理服务容器/提供者(以及它创建的对象)的方法,我们将使用上面列出的 Dependency Resolver 方法。

    对于 MVC Controller ,我们将使用 Steven van Deursen 提出的 Controller 激活方法:
    ASP.NET Dependency Injection Scoped life time

    我创建了一个实现 IDisposable 的虚拟服务,并确认使用两种 DI 方法都调用了 Dispose。

    关于asp.net - Microsoft 依赖注入(inject)和 HttpClientFactory w/.NET Framework 4.6+/MVC 5.2/Web API 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56694228/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com