我有各种报告类型,每种类型都接受某种类型的配置:
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并保持我的对象容器不知道。
答案 0 :(得分:1)
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
由于结果缓存,调用工厂的速度更快。