3

我在 ASP.NET MVC 中有一个应用程序,它也有一个 WCF 服务包含在同一个项目中。

我使用 Autofac 来管理依赖注入。问题是,当通过 Web 访问应用程序时,我需要为每个 Http 请求实例化依赖项。当通过 WCF 访问应用程序时,我需要为每个依赖项实例化依赖项。

在 Castle.Windsor 中,有一个管理混合生活方式的项目(在此链接中)。

我需要类似的东西,比如:

builder.Register<UnitOfMeasureService>(x => new UnitOfMeasureService())
            .As<IUnitOfMeasureService>().HybridLifetimeInstance();

是否有一种解决方法来管理实例生命周期,具体取决于应用程序何时有HttpContext或没有?

4

1 回答 1

5

Autofac 不支持自定义生活方式管理器。

Autofac 生命周期围绕作用域展开,作用域是可嵌套的,并且可以选择使用已知 ID 进行标记。这就是每个 HTTP 请求实例的工作方式:当 Web 请求进入时,会创建一个带有已知值(“AutofacWebRequest”)的嵌套范围“标记”。层次结构如下所示:

  • 容器(根生命周期范围)
    • Web 请求范围(标记为“AutofacWebRequest”)
      • 您可能在代码中创建的任何子范围

使用InstancePerHttpRequest时基本与InstancePerMatchingLifetimeScope("AutofacWebRequest"). 如果您解析类型,它会回退,直到找到具有该名称的范围,然后在该标记范围中使用相同的实例。

在标准 WCF 托管中,Autofac 解析所有您可以从实例上下文 ( AutofacInstanceContext.Current.OperationLifetime) 获取的子范围之外的内容。您可以从中创建一个子生命周期范围并手动标记它,然后像这样解决您的依赖项:

var opScope = AutofacInstanceContext.Current.OperationLifetime;
using(var requestScope = opScope.BeginLifetimeScope("AutofacWebRequest"))
{
  // Resolve InstancePerHttpRequest items from requestScope
}

但是,无法自动执行此操作,并且 WCF 托管机制目前还没有以您可以“插入”并执行此操作的方式构建 - 如果您需要自动创建 Web 请求范围,则必须自行创建基于 Autofac 源代码的 WCF 托管机制

一种选择是拥有两个不同的容器——一个用于 Web 内容,一个用于 WCF 内容——并在每个容器中注册具有不同生命周期的组件。

除此之外......真的没有办法根据 context 来“切换”生命周期。组件声明了一个生命周期,并且必须为该组件注册表使用它。

于 2013-02-28T19:06:47.577 回答