0

我有一個標準的基於StructureMap-的ControllerFactory設置,我有具有各自具有IRepository類型的依賴關係不同的依賴關係,像這樣控制器:插件被實例化一次以上每HttpContext的

// "web" assembly 
public StructureMapRegistry : Registry 
{ 
    public StructureMapRegistry() 
    { 
     Scan(scanner => 
        { 
         scanner.AssemblyContainingType<WidgetController>(); 
         scanner.AssemblyContainingType<Repository>(); 
         scanner.WithDefaultConventions(); 
        }); 

     For<IRepository>().HybridHttpOrThreadLocalScoped().Use<Repository>(); 
    } 
} 

public WidgetController(IService1 service1, IService2 service2, Service3 service3) 
{ 
    // etc, etc 
} 

// "data" assembly 
public Service1 : IService1 
{ 
    public Service1(IRepository repository) 
    { 
     // etc, etc 
    } 
} 

public Service2 : IService2 
{ 
    public Service2(IRepository repository) 
    { 
     // etc, etc 
    } 
} 

public Service3 
{ 
    public Service3(IRepository repository) 
    { 
     // etc, etc 
    } 
} 

使用調試和GetHashCode()之類的,似乎有一個新的Repository被實例化在每個服務當WidgetController,當我期待他們都使用相同的實例。

我誤解了HybridHttpOrThreadLocalScoped()的功能嗎?是否因爲我有時會傳入具體類而不是接口作爲依賴關係,就像我在上面的代碼中使用Service3(常常使用IRepository,從來不是存儲庫具體類)?我完全做錯了嗎?

(此代碼,明顯是從實際的代碼外推,所以我希望我沒有遺漏任何重要的細節。)

注:我使用StructureMap 2.6.1。

回答

0

您發佈的代碼是正確的,您應該在整個請求中獲得相同的IRepository實例。必須有別的事情,你沒有包括在你的問題...

相關問題