[英]Resolving dependencies with constructor injection and named mappings using attributes on the constructor parameter
假设我有两个不同的具体类,它们都实现相同的接口:
public interface IDataSource{
Connection CreateConnection();
}
public class DataSourceA: IDataSource
{
....
}
public class DataSourceB: IDataSource
{
....
}
现在,我想将两个都注册到我的统一容器中:
var container = new UnityContainer();
container.RegisterType<IDataSource, DataSourceA>("A");
container.RegisterType<IDataSource, DataSourceB>("B");
我知道我可以在解析依赖项时指定映射名称:
var myDataSource = conatiner.Resolve<IDataSource>("A");
但是,就我而言,我不会自己解决依赖关系。 我将创建许多不同的控制器,并且将使用UnityDependencyResolver
(来自ASP.Net MCVC)来创建所有控制器。 我的某些控制器需要数据源A,有些需要数据源B,有些则需要两者。 我想做的是指定要使用哪个作为构造函数参数的属性,如下所示:
public class ReportController{
public ReportController([InjectionQualifier("A")] IDataSource dataSource)
{
...
}
}
这样有可能吗? 我来自Java的春季世界,在这种情况下,我将使用该堆栈使用@Qualifier批注。
我个人不喜欢使用Dependency Attribute,因为您直接依赖Unity库。 您最好在构造函数中传递IUnityContainer。
通常,当您需要使用命名依赖项时,这是因为您正在尝试实现某种策略模式。
我要做的是将Unity隔离在名为StrategyResolver的类中,并将StrategyResolver注入为依赖项。 由于StrategyResolver属于我,所以我的“服务”类不再对任何Unity库对象具有任何硬依赖关系,但在StrategyResolver内部除外,但这是可以接受的,因为以后再添加新策略时,我将永远不必再次修改StrategyResolver。
来看一下,我已经通过代码示例详细说明了此答案中的方法: https : //stackoverflow.com/a/37882179/483638
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.