2011-10-27 15 views
3

我有一個使用ASP.NET MVC 1.0構建的web。它使用Structuremap作爲IOC容器。如何設置StructureMap來解決Windows服務中的依賴關係?

ObjectFactory.Initialize(service => 
    { 
     service.ForRequestedType<IOrderRepository>() 
       .TheDefaultIsConcreteType<OrderRepository>() 
       .CacheBy(InstanceScope.PerRequest); 
    }); 

我必須使用相同的後端在Windows服務: 如果我註冊它的Application_Start這樣的國際奧委會部分工作良好。

服務中有一些定時器,同時訪問OrderRepository,所以線程是一個問題在這裏。

我最初的想法是這樣的服務的構造進行註冊:

public Service1() 
{ 
    ObjectFactory.Initialize(service => 
     { 
      service.ForRequestedType<IOrderRepository>() 
        .TheDefaultIsConcreteType<OrderRepository>() 
        .CacheBy(InstanceScope.PerRequest); 
     }); 
} 

這是正確的地方,並用於緩存的正確參數?

documentation of Structuremap,我覺得最保險的辦法是使用默認設置緩存:

PerRequest - 默認操作。將爲每個請求創建一個新實例。

我有印象,PerRequest意味着的HttpContext,但那是另一個入口:

的HttpContext - 單一實例將爲每個的HttpContext創建。在HttpContext.Items集合中緩存實例。

+0

我想你通常會在'OnStart'中做這樣的事情嗎?我想這可能會在單個實例上被多次調用,但這是不可取的。 –

回答

2

每這篇文章:http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.aspx

可執行文件調用ServiceBase派生類的構造函數的 你第一次調用啓動該服務。在構造函數執行後立即調用OnStart命令處理方法 。不在服務已 被加載在第一時間之後再次執行 構造,所以需要分離的處理通過從由執行的OnStart構造進行 。任何資源 可以由OnStop發佈應該在OnStart中創建。在構造函數中創建 資源阻止他們,如果服務將再次啓動調用OnStop發佈了 資源後得到妥善 創建。

聽起來像構造函數是第一次設置結構圖的方式。

+0

裝載和啓動服務之間的區別對我來說是新的!它很難相信,如果你停止並啓動一個服務,構造函數不會再被調用:但是如果這就是文檔所說的話,我猜這就是它。好點子! –

1

說實話,這是更多的是「我的兩分錢」的貢獻,實際上試圖給一個明確的答案,因爲它已經有一段時間,因爲我開發的Windows服務,但在這裏不言而喻。

使從ASP.NET的MVC應用程序在容器的配置將發生在全球的比喻。asax class'Application_Start方法,然後將配置的容器注入到自定義Controller Factory中;我相信你可以不用配置服務構造函數中的所有東西,而是嘗試在可執行文件的Main函數中執行它,因爲它只運行一次,然後將配置的容器注入服務的構造函數中。

我認爲,通過這樣做,您將引導應用程序的所有內容Composition Root,並且服務中的代碼將專注於做它應該做的事情。

就像我說過這一段時間,我從來沒有用IoC容器或DI做過這件事。最好的運氣!