构造函数参数类型的依赖映射
Dependency mapping by a type of constructor parameter
我有多种报告类型,每一种都接受特定类型的配置:
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 并让我的对象不被容器感知。
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
在搜索现有方法失败后,我创建了一个执行这些操作的自定义注入成员 - 请参阅此 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
由于结果缓存,调用工厂的速度更快。
我有多种报告类型,每一种都接受特定类型的配置:
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 并让我的对象不被容器感知。
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
在搜索现有方法失败后,我创建了一个执行这些操作的自定义注入成员 - 请参阅此 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
由于结果缓存,调用工厂的速度更快。