构造函数参数类型的依赖映射

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 并让我的对象不被容器感知。

试试 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

在搜索现有方法失败后,我创建了一个执行这些操作的自定义注入成员 - 请参阅此 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

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