1

我正在使用Ninject WCF擴展項目在我的Web服務上執行依賴注入。如果我將屬性添加到我的Web服務(如IServiceBehavior),那麼在運行時創建它時,如何將依賴關係注入該屬性?Ninject WCF:屬性注入

回答

2

屬性由.NET運行時創建。因此,他們沒有真正的依賴注入。您應儘可能避免擁有需要依賴關係的屬性。您有以下選項:

  1. 服務行爲可以添加沒有屬性。但是這需要您以某種方式擴展當前的WCF擴展,以便以與MVC過濾器目前可能的方式類似的方式來定義您想爲某些實例添加服務行爲。這是在這裏完成的:https://github.com/ninject/ninject.extensions.wcf/blob/master/src/Ninject.Extensions.Wcf/ServiceHost/NinjectServiceHost.cs
  2. 你可以實現一個IInstance提供程序來搜索你的屬性並注入它們。請參閱https://github.com/ninject/ninject.extensions.wcf/blob/master/src/Ninject.Extensions.Wcf/NinjectInstanceProvider.cs

我想嘗試第一個選項。

+0

我最終在應用程序啓動時存儲了對我的內核的靜態引用,以便我從屬性的構造函數中解析出我需要的內容。雖然它是IoC反模式的應用程序,但它比其他選項要容易得多。但感謝您的答案。 – wllmsaccnt

1

我不同意那些屬性不應該有依賴關係。驗證屬性經常會有不可避免的依賴關係。如果使用正確,屬性是DRY的一個很好的例子。

@wllmsaccnt採取的方法實質上是在2.2中刪除的KernelContainer方法 - 但更糟。現在該屬性被耦合到WCF應用程序。

IMO這正是我不同意KernelContainer的移除的原因。我肯定更喜歡注入服務定位器,但我真的不明白爲什麼服務定位器在您無法更改或控制的系統中工作時不鼓勵。

這肯定比編寫額外的自定義代碼更好 - 對於每個應用程序 - 最可能比ServiceLocator更少維護和測試。