2016-03-01 32 views
2

我正在使用SimpleInjector,並在嘗試調用SimpleInjectorServiceHostFactory - > CreateServiceHost(Type serviceType,Uri [] baseAddresses)時出現以下錯誤。此錯誤僅出現在標記爲[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]的WCF服務中。如何在沒有默認無參數構造函數的情況下爲單個WCF服務注入參數

提供的服務類型無法作爲服務加載,因爲它沒有默認(無參數)構造函數。要解決該問題,請向該類型添加默認構造函數,或將該類型的實例傳遞給主機。

對於服務標記爲[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]的SimpleInjectorServiceHostFactory - > CreateServiceHost(類型的serviceType,烏里[] baseAddresses)方法完美地工作,即使該服務不具有默認參數無構造函數。

任何想法如何注入[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]服務的參數就像它發生在[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]服務沒有默認的無參數構造函數?

感謝

+0

我們在NuGet上發佈了3.1.3版的WCF集成包,應該解決這個問題。如果你能測試這個,那將是非常好的。 –

+0

我會這樣做的。謝謝! – kord

+0

您是否如此友善地報告此[問題]中的任何反饋(https://github.com/simpleinjector/SimpleInjector/issues/197) –

回答

2

經過一番挖掘,我發現這是Simple Injector中的一個錯誤,或者至少是WCF處理這種錯誤的方式。

ServiceHost類需要它的ctor中的單例對象而不是類型。如果提供的類型ServiceHost將嘗試創建實例,因此它需要一個默認的構造函數。

我在GitHub上爲此創建了一個issue

,但爲什麼呢?因爲在這種情況下,不需要對「PerCall」 WCF服務

這個默認的構造函數WCF會回調到容器創建類型和簡單的注射器offcourse可以處理的參數在構造函數中。

一個可能的解決方法是確實將您的服務配置爲PerCall,並假設您希望單個進行一些緩存,將WCF實現中的緩存重構爲其自己的類並將其註冊爲Simple Injector中的單例。

1

你必須有一個默認的構造函數是什麼WCF服務調用來創建您的實例。您可以通過使用自己的IInstanceProvider來接管這個過程,並注入您所需要的東西。

如果您使用Singleton(Single),ServiceHost希望您傳遞一個已經創建的實例(您可以使用任何類型的構造函數創建該實例)。我不確定你的DI FX如何構建這種實例。同樣看到這個答案WCF ConcurrencyMode Single and InstanceContextMode PerCall

+0

但爲什麼「PerCall」WCF服務不需要此默認構造函數? – kord

相關問題