2017-04-03 32 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。命名实例帮助我实现我的目标。 –