asp.net-mvc-3 - Autofac - 混合 InstancePerHttpRequest 和异步作用域

标签 asp.net-mvc-3 scope autofac

我正在构建一个以 MVC3 作为主要前端的四层系统,但包含由服务层异步运行并报告进度的长时间运行的任务,MVV 将使用 Ajax 显示这些任务。我使用 Autofac 进行依赖项注入(inject) (DI),主要是因为界面和文档很好,而且速度很快(请参阅 Philip Mateescu 关于 DI speed 的出色研究)。

我的问题是关于如何设置 Autofac 来处理注入(inject)项目的两个范围,即 MVC3 依赖项必须是 PerHttpRequest,但异步任务依赖项需要是 InstancePerLifetimeScope。

显然,服务层需要使用单独的 DI 来解决长时间运行的任务的依赖关系。这样做的最佳方法是什么?

最佳答案

更新 - 2014 年 6 月

随着使用 AutoFac 的最佳实践以及 MVC 的变化,我更新了这个答案。变化是 AutoFac 中的最佳实践现在是通过使用 .InstancePerLifetimeScope() 后缀来定义需要在访问的整个生命周期内持续的任何实例,在 MVC 的 HttpRequest 的情况下。请参见下面的示例:

builder.RegisterType<MyDbContext>().As<IMyDbContext>().InstancePerLifetimeScope();

完成后,您不再需要指定您在任务中创建的新生命周期范围的名称(请参阅下面已更新的原始答案)。

以下是一些您可能会发现有用的关于 MVC 中任务的其他注意事项:

  • 如果您正在使用新的 async/await,则不需要新的生命周期范围。 Aysnc/await 保留当前上下文并简单地释放线程以提高网络在负载下的性能。
  • 如果您真的想在后台运行某些东西,请注意 - 有一些问题。我建议你阅读这个 helpful blog post来自异步专家 Stephen Cleary。
  • 一个非常有用的组合是将 SignalR 与 MVC 结合使用来报告进度并允许用户取消。这对我很有效。

原始帖子,但已更新(注意:您必须如上所示注册生命周期实例)

我已经找到了如何通过 Google Autofac 组处理具有依赖项的异步任务。事实证明,您可以访问 MVC 级容器,然后创建一个新的解析生命周期范围。有很多方法可以做到这一点,但这 answer Alex Meyer-Gleaves(专家)提供了答案。亚历克斯建议使用下面的代码来运行具有不同范围的任务。

public void Run<T>(Action<T> action)
{
  Task.Factory.StartNew(delegate
  {
    using (var container = AutofacDependencyResolver.Current
                           .ApplicationContainer.BeginLifetimeScope())
    {
        var service = container.Resolve<T>();
        action(service);
    }
  });
}

有指向更详细博客文章的链接 here关于亚历克斯帖子中的主题,这也非常有用。

关于asp.net-mvc-3 - Autofac - 混合 InstancePerHttpRequest 和异步作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10879648/

相关文章:

asp.net - 如何让 Autofac 在 Orchard CMS 中执行属性注入(inject)

asp.net-mvc-3 - 在 Razor View 引擎中使用三元运算符进行 Html 渲染

c# - Entity Framework 和类

.net - 尝试使用 Combres Nuget 包缓存图像 js 文件时遇到问题

JavaScript 闭包和作用域 : How to pass an outer scope variable to a callback function which is passed as an argument?

c# - GraphQL + Autofac

c# - 购物车超时

python - 从类定义中的列表理解访问类变量

嵌套函数的 R 范围规则

azure - Azure 函数中的 Autofac 依赖注入(inject)