2011-07-08 74 views
0

我目前正在嘗試構建一個應用服務器,該應用服務器應承載多個WCF服務。這些服務(當然還有它們的依賴關係)應該由DI/IoC容器實例化(目前是LightCore,但由於我通過CommonServiceLocator使用它,應該很容易交換)。 不幸的是我偶然發現了一個問題。很顯然,我必須創建ServiceHost實例來託管提到的WCF服務。我已經構建了一個自定義的InstanceProvider和ServiceBehavior來處理服務的所有依賴關係,但ServiceHost的構造函數需要服務的服務類型來託管。在我的程序中的這一點上,我只知道接口類型,因爲只有DI容器知道當前正在使用哪個Service實現。WCF構造函數通過DI的服務類型

一個便宜的方法是通過服務定位器創建服務類型的「虛擬」實例,併爲ServiceHost構造函數提供myDummyInstance.GetType()的輸出,但這樣看起來很痛苦,無用的實例化和使用服務定位器而不是DI ...應該有更好的方法。

任何想法的人? :)

回答

0

有多種方式如何做到這一點。

  • 我喜歡的方式很簡單。你不會解決你的服務的合同,但服務實現本身,因爲這就是WCF所期望的。我使用的所有IoC容器都能夠解析類型本身並填充它的依賴關係。
  • 另一種方法是一點點黑客攻擊。當您調用服務主機的構造函數時,您將通過調用類似ServiceLocator.Resolve<IContract>().GetType()來解決服務合同的類型。這很醜陋,但是它比創建虛擬實現要乾淨得多。此外,你永遠不知道傳遞的類型是不是用於基礎設施中的其他東西,所以傳遞虛擬類型可能是危險的。
+0

嗨。不幸的是,CommonServiceLocator似乎不允許/支持你的第一種方式(或者我誤解了它),這將是完美的解決方案。 第二種方式對我的虛擬實例不會有很大的不同。我沒有一個實例引用,但是它使用了ServiceLocator(也許是不可避免的),也創建了一個虛擬實例,只是沒有引用它:)。 – Pharao2k