Unity Container 解析具有相同接口的对象字典
Unity Container resolve a Dictionary of objects with same Interface
我得到了以下方块
container.RegisterType<IService, ServiceA>("a");
container.RegisterType<IService, ServiceB>("b");
我想要一个 Dictionary<string,IService>
类型的字典。
我将在 API 休息时通过参数接收服务名称,我的想法是基于该参数从字典中获取我需要的实现。
我不知道如何将字典(里面有已解析的 classes)注入我的业务 class。
我想做这样的事情。
private readonly IDictionary<string,IService> serviceDictionary;
public ClassConstructor (IDictionary<string,IService> dictionary)
{
this.serviceDictionary = dictionary;
}
您不应该将 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>();
我得到了以下方块
container.RegisterType<IService, ServiceA>("a");
container.RegisterType<IService, ServiceB>("b");
我想要一个 Dictionary<string,IService>
类型的字典。
我将在 API 休息时通过参数接收服务名称,我的想法是基于该参数从字典中获取我需要的实现。
我不知道如何将字典(里面有已解析的 classes)注入我的业务 class。 我想做这样的事情。
private readonly IDictionary<string,IService> serviceDictionary;
public ClassConstructor (IDictionary<string,IService> dictionary)
{
this.serviceDictionary = dictionary;
}
您不应该将 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>();