繁体   English   中英

使用构造函数参数上的属性通过构造函数注入和命名映射来解决依赖项

[英]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("A")]

使用Unity如何将命名依赖项注入到构造函数中?

我个人不喜欢使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM