【问题标题】:Autofac - mixed InstancePerHttpRequest and asynchronous scopeAutofac - 混合 InstancePerHttpRequest 和异步范围
【发布时间】:2012-06-04 10:13:32
【问题描述】:

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

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

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

【问题讨论】:

  • 我不确定你问题的第二部分是否很清楚。您能否提供一些代码 sn-ps 或其他说明?
  • 您好 Travis,感谢您查看此内容,抱歉,第二个问题有点含糊。我在其他地方找到了更多信息,因此删除了我的第二个问题,因为它有点过于复杂,无法在几行中列出。我保留了原始信息,因为它可能对其他人有用。谢谢。

标签: asp.net-mvc-3 scope autofac


【解决方案1】:

更新 - 2014 年 6 月

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

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

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

以下是关于 MVC 中的任务分配的其他一些说明,您可能会发现它们很有用:

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

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

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

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);
    }
  });
}

在 Alex 的帖子中有一个更详细的博客帖子 here 的链接,该主题也非常有用。

【讨论】:

  • 请在此处添加答案作为答案,而不是编辑您的问题。这是 Stack Overflow 问答格式的最佳方式。谢谢。
  • 感谢乔恩·史密斯。你不会碰巧有一个关于 MVC + Autofac 的 InstancePerLifetimeScope 最佳实践的链接吗?我看了here,但没有喜悦...
  • 嗨@Johnny Reilly。它在 wiki 中的 Controlling Scope and Lifetime -> Instance Scope 下。 code.google.com/p/autofac/wiki/InstanceScope。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
相关资源
最近更新 更多