1

我在WCF中使用UserNamePasswordValidator以及Unity進行依賴項注入,但是由於WCF創建UserNamePasswordValidator的實例,我無法將我的容器注入到類中。那麼,如何去做呢?如何在WCF中將依賴關係注入到自定義的UserNamePasswordValidator中?

我能想到的最簡單的解決方案是圍繞UnityContainer的一個靜態實例創建一個靜態代理/包裝類,它公開了所有相同的方法......這樣,任何類都可以訪問該容器,並且我不會無需在任何地方注入它。

所以我可以在代碼中的任何位置執行UnityContainerWrapper.Resolve()。所以基本上這個解決方案爲我解決了兩個問題,我可以在沒有創建實例的類中使用它,我可以在任何地方使用它,而無需將容器注入一堆類。

我能想到的唯一缺點是我現在可能將我的容器暴露給一堆以前沒有訪問容器的類。不確定這是否是一個問題?

回答

1

是的,這個下降是非常糟糕的,你應該避免它。你的情況,你可以做這樣的事情

public class CustomUserNameValidator : UserNamePasswordValidator 
    { 
     public static CustomUserNameValidator Current { 
      get; private set; 
     } 

     public CustomUserNameValidator() { 
      Current = this; 
     } 

     public override void Validate(string userName, string password) 
     { 
      throw new FaultException("No pasaran"); 

     } 

     [Dependency] 
     public ISomeService Service { 
      get; set; 
     } 
    } 

它將爲服務創建服務主機時,可以創建一次,所以你應該寫下面的代碼

using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService))) //here it will be created 
      { 
       container.BuildUp(CustomUserNameValidator.Current); //here you can inject all you need 
      } 

這僅僅是倒置的想法與靜包裝的統一容器:)

+0

我通過IIS託管,所以我猜我可以在服務合同的構造函數中執行BuildUp。但是,這仍然有一個缺點,你必須公開地公開你的服務......但我想這比暴露整個容器好多了。 – Dannerbo 2010-05-22 17:33:58

+0

在另一個說明...因爲我使用配置文件來映射我的所有對象的Unity,我的原始靜態想法仍然是一個問題? 假設我沒有圍繞統一容器實例使用靜態包裝類,我仍然可以在代碼中的任意位置創建一個新的UnityContainer,並使用配置文件對其進行配置並創建任何我想要的對象。所以我不確定UnityContainerWrapper的想法是甚至創造一個「問題」,它只是使一個現有的問題更明顯?如果這是有道理的...... – Dannerbo 2010-05-22 18:25:04

+0

可能,你有幾個程序集,但只有一個是Unity意識 - 最高層,所以其他人根本不能創建unitycontainer。 第二件事是終生管理。我真的很高興創建兩個容器與單身人士,因爲你可以得到你期望的整個其他行爲。所以這是一些常規的事情,但它使這種情況非常不可取。 – 2010-05-23 05:30:50