2017-04-03 34 views
0

我想實現我的.NET應用DI。我的數據訪問層中有3個API類。我必須一次使用它們中的任何一個。我試圖提出條件統一決議,但不知道如何實現。請一些身體幫助我與示例代碼如何有條件地管理我的3注入類。如何配置統一集裝箱解決多重依賴性?

目前我剛剛註冊我的班以下way-

  IUnityContainer _container = new UnityContainer(); 
      _container.RegisterType(typeof(IPolicyAdminApi), typeof(SomeApiclass1)); 
      _container.RegisterType(typeof(IPolicyAdminApi), typeof(SomeApiclass2)); 
      _container.RegisterType(typeof(IPolicyAdminApi), typeof(SomeApiclass3)); 
      IPolicyAdminApi policyAdmin = _container.Resolve<IPolicyAdminApi>(); 
      return policyAdmin; 
+0

我已經發布了建議,但你真的應該問自己,爲什麼你有3種方式中實現一個單一的服務 - 你肯定不應該有3個獨立的服務(即3個獨立的接口)... ? –

回答

1

團結支持命名註冊,以允許這種歧義,所以你可以寫你的註冊碼是這樣的:

IUnityContainer _container = new UnityContainer(); 
_container.RegisterType("A", typeof(IPolicyAdminApi), typeof(SomeApiclass1)); 
_container.RegisterType("B", typeof(IPolicyAdminApi), typeof(SomeApiclass2)); 
_container.RegisterType("C", typeof(IPolicyAdminApi), typeof(SomeApiclass3)); 
IPolicyAdminApi policyAdmin = _container.Resolve<IPolicyAdminApi>("A"); 
return policyAdmin; 

你可以指定使用Unity Dependency屬性需要註冊哪個註冊:

public SomeConstructor([Dependency("A")] IPolicyAdminApi api) 
{ 
} 
+0

這似乎太棒了。它有助於 。但我想在運行時解決這個依賴關係。目前我們正在配置它來解析「A」。你的意思是我們可以添加,如果條件在這裏給3個班的所有的條件。 –

+0

@PratikBompilwar你可能想在這種情況下,建立一個'IPolicyAdminApiFactory' - 仰望'Factory'模式。儘管如此,你還是有點不清楚。 –

+0

感謝@RB的幫助。指定名稱,然後將其放在if else條件適用於我。 –

1

如所建議的在另一個答案,與UnityIoC溶液是Named Registration,與一個工廠組合。你可以做一個典型的工廠模式,但我一直在做,到全依賴注入,是注入了工廠,作爲一個函數:

在註冊:

// Register the named instances. 
_container.RegisterType<IPolicyAdminApi, SomeApiclass1>("Name1"); 
_container.RegisterType<IPolicyAdminApi, SomeApiclass2>("Name2"); 
_container.RegisterType<IPolicyAdminApi, SomeApiclass3>("Name3"); 

// Register the factory. 
_container.RegisterType<Func<string, IPolicyAdminApi>>(
      new InjectionFactory(c => 
       new Func<string, IPolicyAdminApi>(
        namedInstance => c.Resolve<IPolicyAdminApi>(namedInstance)))); 

在類

class ImUsingTheRegistration 
{ 
    private Func<string, IPolicyAdminApi> iPolicyAdminApiFactory; 

    public ImUsingTheRegistration(Func<string, IPolicyAdminApi> iPolicyAdminApiFactory) 
    { 
     this.iPolicyAdminApiFactory = iPolicyAdminApiFactory; 
    } 

    public void ImAtRunTime() 
    { 
     string namedInstance = "Name" + Datetime.Now.ToString().Right(1); 

     IPolicyAdminApi instance = iPolicyAdminApiFactory(namedInstance); 
    } 
} 

注:我使用的是通用的註冊,但它會與其他模式工作了。此外,這將導致失敗,沒有註冊,4,5,... 0,但你的想法。

+0

謝謝@Tipx。命名實例幫助我實現我的目標。 –