Autofac:从SingleInstance'd类型引用到HttpRequestScoped

时间:2010-04-08 11:58:33

标签: asp.net scope autofac

我有一个应用程序,其中共享对象需要对每个请求对象的引用。

Shared:      Engine
                |
Per Req:  IExtensions()
                |
             Request

如果我尝试将IExtensions直接注入到Engine的构造函数中,即使是Lazy(Of IExtension),我也会得到一个“没有范围匹配[请求]从可见范围中可见该实例被要求。“尝试实例化每个IExtension时的异常。

如何创建HttpRequestScoped实例,然后将其注入共享实例?

Request的工厂设置它(因此将Engine注入RequestFactory)会被认为是一种好习惯吗?

1 个答案:

答案 0 :(得分:1)

由于Engine的共享生命周期要求,您无法将请求范围的扩展注入其中。您可能拥有的是Engine上的方法或属性,它将主动解析当前请求范围中的扩展集合。

首先,让Engine采用构造函数依赖:

public class Engine
{
    public Engine(..., Func<IExtensions> extensionsPerRequest) 
    {
        _extensionsPerRequest = extensionsPerRequest;
    }


    public IExtensions Extensions
    {
       get { return _extensionsPerRequest(); }
    }
 }

然后,在您的Autofac注册中:

builder.Register<Func<IExtensions>>(c => RequestContainer.Resolve<IExtensions>());