通过一种构造函数参数

时间:2016-06-23 16:40:31

标签: c# dependency-injection unity-container

我有各种报告类型,每种类型都接受某种类型的配置:

interface IConfig { ... }
interface IReport { ... }

class ConfigA : IConfig { ... }
class ConfigB : IConfig { ... }

class ReportA : IReport
{
    public ReportA (ConfigA config)
    { ... }
}

class ReportB : IReport
{
    public ReportB (ConfigB config)
    { ... }
}

如何配置Unity容器以通过传递的构造函数参数来解析IReport

var reportA = unityContainer.Resolve<IReport>(new ConfigA()); // Should be ReportA
var reportB = unityContainer.Resolve<IReport>(new ConfigB()); // Should be ReportB

我知道可以创建一种带有类型映射的工厂,但是在这里我想要依赖Unity并保持我的对象容器不知道。

2 个答案:

答案 0 :(得分:1)

尝试DependencyOverride

var reportA = unityContainer.Resolve<IReport>(new DependencyOverride<IConfig>(new ConfigA()); // Should be ReportA
var reportB = unityContainer.Resolve<IReport>(new DependencyOverride<IConfig>(new ConfigB()); // Should be ReportB

答案 1 :(得分:1)

在搜索现有方法失败后,我创建了一个自定义注入成员来完成这些工作 - 请参阅此Nuget package

首先,我们假设我们已经注册了这两份报告:

var unityContainer = new UnityContainer();

unityContainer.RegisterType<IReport, ReportA>("ReportA");
unityContainer.RegisterType<IReport, ReportB>("ReportB");

然后我们只使用IReport添加InjectionMember的另一个注册:

unityContainer.RegisterType<IReport>(new InjectionConstructorLookup<IConfig>());

此处IConfig类型参数表示我们将查找IReport - 继承自IConfig的构造函数参数的继承对象。

然后有两种方法可以解析IReport。第一个是@Backs提到的一个:

var reportA = unityContainer.Resolve<IReport>(new DependencyOverride<IConfig>(new ConfigA())); // Should be ReportA
var reportB = unityContainer.Resolve<IReport>(new DependencyOverride<IConfig>(new ConfigB())); // Should be ReportB

第二个是代表工厂:

var factory = unityContainer.Resolve<Func<IConfig, IReport>>();

var reportA1 = factory(new ConfigA()); // Should be ReportA
var reportB1 = factory(new ConfigB()); // Should be ReportB

由于结果缓存,调用工厂的速度更快。