Autofac:是否可以将生命周期范围传递给另一个构建器?

时间:2012-06-13 08:28:34

标签: oop autofac

问题:

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

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

  1. 通过调用ServiceLayer中的模块来注册较低级别。它使用标准NuGet Autofac包来处理自身和所有其他程序集的注册。
  2. 然后Ui层使用NuGet Autofac.MVC包注册各种控制器和IActionInvoker for Action Method注入。
  3. 我的DataLayer中的UnitOfWork类目前已在InstancePerLifetimeScope中注册,因为它是由ServiceLayer注册的,它使用普通的Autofac并且对InstancePerHttpRequest一无所知。但是我读了here我应该使用InstancePerHttpRequest范围。

    问题:

    我的问题是,我可以传递一个生命周期范围,即MVC层可以将InstancePerHttpRequest传递给服务层以便在需要的地方使用吗? Alex Meyer-Gleaves似乎认为这可能来自下面post的评论:

      

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

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

2 个答案:

答案 0 :(得分:0)

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

和我一样,我在as.net mvc和多个app层使用autofac。我需要有一个终身范围的情况下传递Container本身。我有一个执行任务的后台队列。每个人都需要拥有自己的范围并在交易中被豁免。 Queue有一个IContainer实例(它是一个单例),对于每个任务,它都会开始一个新范围并执行任务。

Db访问和所有设置为INstancePerLifetimeScope以便在这种情况下工作,当我在控制器中使用它时我没有问题。

答案 1 :(得分:0)

在MikeSW的帮助下,Cecil Philips和Travis Illig(谢谢你们)我已经走上正轨。我阅读了各篇文章,特别是Alex Meyer-Gleaves发表的帖子here,似乎InstancePerLifetimeScope在被Autofac.MVC软件包解析时被视为InstancePerHttpRequest,在某些限制内(阅读Alex的帖子了解这些限制)。 Alex的评论是:

  

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

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