2010-03-23 157 views
4

我試圖用依賴注入來鎖定WCF。我發現的所有示例都基於假設您使用.svc(ServiceHostFactory)服務或使用app.config來配置容器。其他的例子也是基於容器被傳遞給類。WCF和Unity - 依賴注入

我想要一個解決方案,其中容器不傳遞(不緊密耦合到Unity)。我沒有使用配置文件來配置容器,以及我使用自託管服務的位置。

問題是 - 正如我所見 - ServiceHost將服務實現的類型作爲參數使用,因此使用InstanceProvider有什麼不同?

溶液我已經想出了此刻是註冊的ServiceHost(或專門化)的註冊的名稱(例如container.RegisterInstance<Type>("ServiceName", typeof(Service);)一個類型。

然後container.RegisterType<UnityServiceHost>(new InjectionConstructor(new ResolvedParameter<Type>("ServiceName")));註冊ServiceHost。

有更好的解決方案嗎?我可能是我的假設方式。

最好的問候,
邁克爾

回答

3

使用構造器注入要連接服務實現,就像你會與任何其他類。

Here's a writeup on how to make WCF understand Constructor Injection

該答案中的示例演示可憐的人的注射,但您可以從中推斷並在ServiceHostFactory中設置UnityContainer實例,而不是硬編碼的依賴項。

您將容器實例一直傳遞給自定義IInstanceProvider。現在,您可以在GetInstance方法中使用容器:

public object GetInstance(InstanceContext instanceContext) 
{ 
    var serviceType = instanceContext.Host.Description.ServiceType; 
    return this.container.Resolve(serviceType); 
} 
+0

是的,我不喜歡繞過容器。我會嘗試使用泛型。 – Michael 2010-03-23 15:16:14

+0

什麼時候在InstanceProvider上調用GetInstance?當我打開服務主機? – Michael 2010-03-23 15:17:29

+0

您只能在這三個WCF類(ServiceHostFactory,ServiceHost和IInstanceProvider)中傳遞容器。這幾乎不是Service Locator的反模式 - 它只是DI基礎設施。你甚至可以創建一個圍繞Unity的通用庫。溫莎城堡的WcfFacility就是這麼做的。要回答您的其他問題:每次調用服務操作時都會調用GetInstance。 – 2010-03-23 15:23:18