2010-04-08 29 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