2

问题:

我正在用 Ui、ServiceLayer、BizLayer 和 DataLayer 构建一个四层系统。根据良好实践,ServiceLayer 对 Ui 隐藏了 BizLayer 和 DataLayer,当然 ServiceLayer 不知道 Ui 层是什么。

我的实现是单个 .NET 应用程序,每一层都在自己的程序集中。我在我的 MVC3 Ui 层中使用 Autofac.MVC3 来执行 Web 请求中使用的所有解析类。我还在我的 ServiceLayer 中包含标准 Autofac,以便它可以处理我的应用程序中所有其他层的注册。在系统启动时,我调用一个方法来向 Autofac 注册所有类型。这样做:

  1. 通过调用 ServiceLayer 中的模块来注册较低级别。它使用标准 NuGet Autofac 包处理自身和所有其他程序集的注册。
  2. 然后 Ui 层使用 NuGet Autofac.MVC 包注册各种控制器和 IActionInvoker 用于 Action Method 注入。

我的 DataLayer 中的 UnitOfWork 类当前已在 InstancePerLifetimeScope 中注册,因为它是由使用普通 Autofac 的 ServiceLayer 注册的,并且对 InstancePerHttpRequest 一无所知。但是我在这里读到我应该使用 InstancePerHttpRequest 范围。

问题:

我的问题是,我可以传递一个生命周期范围,即 MVC 层可以将 InstancePerHttpRequest 传递到服务层以在需要的地方使用吗?Alex Meyer-Gleaves 在下面这篇文章的评论中似乎暗示这是可能的:

也可以将您自己的 ILifetimeScopeProvider 实现传递给 AutofacDependencyResolver,以便您可以控制在 ASP.NET 运行时之外的生命周期范围的创建

然而,他建议的方式似乎是 MVC 特定的,因为 ILifetimeScopeProvider 是 MVC 扩展类。任何人都可以提出另一种方式或者 InstancePerLifetimeScope 可以吗?

4

2 回答 2

0

InstancePerHttpRequestScope 实际上是 InstantPerLifetimeScope 的一个变体。第一个仅适用于请求。如果你想在后台线程上执行一些东西,它将不可用。

像你一样,我在 as.net mvc 和多个应用层中使用 autofac。对于需要拥有生命周期范围的情况,我会绕过 Container 本身。我有一个执行任务的后台队列。每个任务几乎都需要有自己的范围并在事务中执行。Queue 有一个 IContainer 实例(它是一个单例),对于每个任务,它都会开始一个新的范围并执行该任务。

为了在这种情况下工作,数据库访问和所有设置都设置为 INstancePerLifetimeScope,当我在控制器中使用它们时我没有问题。

于 2012-06-13T10:35:34.663 回答
0

在 MikeSW、Cecil Philips 和 Travis Illig(谢谢大家)的帮助下,我走上了正轨。我阅读了各种帖子,尤其是 Alex Meyer-Gleaves 在这里的帖子,似乎 InstancePerLifetimeScope 在由 Autofac.MVC 包解决时被视为 InstancePerHttpRequest,在某些限制内(阅读 Alex 的帖子了解这些限制)。亚历克斯的评论是:

使用 InstancePerHttpRequest 可确保在运行时从正确的生命周期范围解析服务。在 MVC 的情况下,这始终是特殊的 HTTP 请求生命周期范围。

这意味着我可以安全地将整个 htpp 请求需要单个实例的任何内容注册为 InstancePerLifetimeScope,只要我没有子范围的项目,它就可以正常工作。这很好,我可以使用它。

于 2012-06-14T13:29:33.417 回答