Unity Container解析具有相同接口的对象的Dictionary

时间:2016-11-26 01:50:50

标签: c#-4.0 dependency-injection inversion-of-control unity-container

我得到了以下块

 container.RegisterType<IService, ServiceA>("a");
 container.RegisterType<IService, ServiceB>("b");

我想要一个类型为Dictionary<string,IService>的词典。

我将在API休息中通过参数接收服务名称,我的想法是基于该参数从字典获取我需要的实现。

我无法弄清楚如何将Dictionary(带有已解析的类)注入我的业务类。 我想做这样的事情。

private readonly IDictionary<string,IService> serviceDictionary;

public ClassConstructor (IDictionary<string,IService> dictionary)
{
    this.serviceDictionary = dictionary;
}

1 个答案:

答案 0 :(得分:2)

您不应该将IDictionary<string,IService>注入到组件中,而应该是应用程序定制的抽象:

public interface IServiceProvider
{
    IService GetService(string key);
}

这样您可以按如下方式为Unity创建实现:

public class UnityServiceProvider : IServiceProvider
{
    public IUnityContainer Container { get; set; }

    public IService GetService(string key) => Container.Resolve<IService>(key);
}

现在您可以按如下方式完成注册:

container.RegisterType<IService, ServiceA>("a");
container.RegisterType<IService, ServiceB>("b");
container.RegisterInstance<IService>(new UnityServiceProvider { Container = container });
container.RegisterType<ClassConstructor>();