2010-04-08 26 views
1

我有一个应用程序,其中共享对象需要对每个请求对象的引用。Autofac:从SingleInstance的类型引用到HttpRequestScoped

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

如果我尝试将IExtensions直接注入的Engine构造,即使Lazy(Of IExtension),我得到一个“没有匹配的范围[要求]是其中要求实例的范围是可见的。”当它试图实例化每个IExtension时例外。

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

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

回答

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>()); 
+0

非常感谢您的解决方案。 我花了一点时间找出在VB中我需要在Register()调用中自己构造一个函数,但现在它工作:D Autofac注册的lambda是:Function(c)New Func(Of IExtensions)(函数()RequestContainer.Resolve(的IExtensions)()) – wagi 2010-04-08 21:44:18

+0

啊,很酷。很高兴能帮上忙! – 2010-04-09 06:33:24