C# Autofac中的混合生活方式

C# Autofac中的混合生活方式,c#,asp.net-mvc-3,autofac,C#,Asp.net Mvc 3,Autofac,我在ASP.NET MVC中有一个应用程序,在同一个项目中还包含一个WCF服务 我正在使用Autofac管理依赖项注入。问题是,当通过web访问应用程序时,我需要每个Http请求实例化依赖项。当通过WCF访问应用程序时,我需要每个依赖项实例化依赖项 在温莎城堡,有一个管理混合生活方式的项目 我需要类似的东西,比如: builder.Register<UnitOfMeasureService>(x => new UnitOfMeasureService())

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

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

在温莎城堡,有一个管理混合生活方式的项目

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

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

根据应用程序何时具有HttpContext或不具有HttpContext,是否存在管理实例生存期的变通方法?

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

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

var opScope = AutofacInstanceContext.Current.OperationLifetime;
using(var requestScope = opScope.BeginLifetimeScope("AutofacWebRequest"))
{
  // Resolve InstancePerHttpRequest items from requestScope
}
  • 容器(根生存期范围)
    • Web请求范围(标记为“AutofacWebRequest”)
      • 您可以在代码中创建的任何子作用域
使用
InstancePerHttpRequest
时,它基本上与
InstancePerMatchingLifetimeScope(“AutofacWebRequest”)
相同。如果解析该类型,它将返回,直到找到具有该名称的作用域,然后在该标记的作用域中使用相同的实例

在标准WCF宿主中,Autofac解析从实例上下文(
AutoFacinStateContext.Current.OperationLifetime
)中可以获得的子范围之外的所有内容。您可以从中创建一个子生存期范围并手动标记它,然后像这样解决依赖关系:

var opScope = AutofacInstanceContext.Current.OperationLifetime;
using(var requestScope = opScope.BeginLifetimeScope("AutofacWebRequest"))
{
  // Resolve InstancePerHttpRequest items from requestScope
}
然而,没有办法自动完成这项工作,WCF托管机制目前的架构也不是您可以“插入”并完成这项工作的——如果您需要自动创建web请求范围,您必须基于Autofac源代码推出自己的WCF托管机制

另一个选项是使用两个不同的容器——一个用于web内容,另一个用于WCF内容——并在每个容器中以不同的生存期注册组件

除此之外真的没有办法根据上下文“切换”生命周期。组件声明了一个生存期,并且必须与该组件注册表的生存期共存