gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:12:25 25 4
gpt4 key购买 nike

我正在构建一个以 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/

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