0

我很不確定我應該如何處理這個新的Unity容器。抽象工廠和統一依賴注入

繼承人廠我有:

class DataCopierFactory : IDataCopierFactory 
{ 
    private readonly IUnityContainer _container; 
    //not mad on binding the factory to the container, but feck it 
    public DataCopierFactory(IUnityContainer container) 
    { 
    _container = container; 

    } 

    //return a data copier that will transfer data from any DB to any other DB 
    public IDataCopier createDataCopier(int i) 
    { 
     switch(i) 
     { 
      case 1: 
       return new ScheduleDataCopier(new LTEEFContext()); //somehow resolve the LTEEFContext.. 
      //case 2: 
      //  
      default: 
       throw new InvalidOperationException("Parameter -t=" + i + " does not exist"); 

     } 
    } 
} 

當我打電話的createDataCopier方法,並傳遞一些枚舉,我想使用統一的容器來解決我的各類IDataCopiers的DB對象上下文。

我該怎麼做?

我應該在班級中打電話給工廠嗎?或者注入unitycontainer並在那一點解析不同的DB對象上下文。

IDatacopier的每個實現都有一個IDBContext作爲構造函數,我想基本上注入它,但允許我爲Datacopier的不同實現更改上下文。

希望這是有道理的... :) 在此先感謝 尼爾

回答

1

找到了答案..好是我的錯:)

我試圖注入ObjectContext的作爲依賴時我不應該有。我不認爲工廠應該有你的IOC容器的實例。

即使使用Repository模式,每個DataCopier impl都不需要ObjContext的實例,因爲它們都具有它們各自所需的存儲庫的實例。

這可能是做事情的最佳方式,因爲我將數據庫耦合到數據訪問類,但我認爲它可以,因爲抽象已經存在於數據庫和對象上下文之間(我將objectcontext注入爲依賴項使用Unity的所有回購的)

歡迎任何建議..

0

我建議有你IDataCopier多個統一註冊(每個實現)。您可以通過採用IDataCopier []的構造函數參數將它們全部注入到工廠中。 注意:使用Unity 必須在名稱的每個註冊時進行乘法註冊。

然後你需要一種方法來選擇你想要的。我建議添加一個get屬性到你的IDataCopier接口,它可以是int或字符串標籤。然後,您的createDataCopier(int)可以查詢您從Unity獲得的IDataCopier [],其中get屬性== int i。這是「戰略模式」,並且比靜態切換語句具有更大的靈活性。將IDataCopier []存儲到字典字段中將是方便選擇的便捷方式,但是簡單的LINQ語句也可以。