2

我在ASP.NET MVC 4應用程序中使用Unity容器進行依賴注入。使用Unity動態注入構造函數參數

對於特定的控制器(說ProductController的),我有一個依賴注入方案如下:

  1. 的ProductController的構造函數採用IProductsRepository實例。
  2. IProductsRepository實現有一個接受IProductsService實例的構造函數。
  3. IProductsService實現具有一個構造函數,該構造函數接受從Web請求中的cookie中檢索的身份驗證令牌字符串。

考慮到驗證令牌cookie只能在控制器實例創建後才能檢索到,在這種情況下執行自動依賴注入的正確方法是什麼?

回答

1

如果您需要延遲ProductService的創作,你可以

  • 注入一個定製的工廠,瞭解服務
  • 讓DI容器自動生成Func<IProductService>類型的委託工廠,並注入該委託進入控制器
  • 讓容器生成lazy proxy隱藏從消費者服務的延遲創建

我更喜歡第三種選擇,因爲它對於消費者來說是完全透明的IProductService

0

我認爲你有兩個選擇:

1使用container.Resolve()和傳遞參數時,它的可用。

因此,而不是在構造函數中要求的IProductsServiceProductsRepository你做這樣的事情:

IProductsService anInstance = container.Resolve<IProductsService>(new ParameterOverride("authenticationTokenString", "myValue")); 

這就是所謂的ParameterOverride。 MSDN文檔可以在這裏找到:Resolving Objects by Using Overrides

2而不是傳遞簡單的身份驗證令牌字符串,將其封裝在一個接口後面並通過該接口。您的IProductsService將採取IAuthenticationTokenProvider,並會要求該班級獲取所需的標記。您的實現將在創建後訪問所需的對象以獲取正確的值。

我會選擇選項二。它可以讓你的設計保持清潔,讓Unity處理所有依賴注入,而無需任何手動工作。

相關問題