【发布时间】:2021-04-15 18:07:40
【问题描述】:
考虑以下两个类:
public class Number
{
public int Value { get; set; }
}
public class Multiplier
{
private readonly Number first;
private readonly Number second;
public Multiplier(Number first, Number second)
{
this.first = first;
this.second = second;
}
public int Multiply() => this.first.Value * this.second.Value;
}
Multiplier 类依赖于 Number 的两个实例。我想使用 DryIoc DI 容器将它们作为 命名服务 注入。执行此操作的代码如下所示:
var container = new Container();
container.RegisterInstance(new Number{Value = 2}, serviceKey:"first");
container.RegisterInstance(new Number{Value = 4}, serviceKey:"second");
container.Register<Multiplier>();
var consumer = container.Resolve<Multiplier>();
Console.WriteLine(consumer.Multiply());
此代码失败并出现 DryIoc.ContainerException(在调用 Resolve 时),因为已注册的实例无法解析为构造函数参数。我的问题基本上是:有什么方法可以让我指定应该将哪个命名的 serviceKey 解析为哪个构造函数参数?
在 MEF 中,我将执行以下操作来实现此目的:
[Export(typeof(Multiplier))]
public class Multiplier
{
private readonly Number first;
private readonly Number second;
[ImportingConstructor]
public Multiplier([Import("first")]Number first,
[Import("second")]Number second)
{
this.first = first;
this.second = second;
}
public int Multiply() => this.first.Value * this.second.Value;
}
然后使用服务名称导出依赖项:
var container = new CompositionContainer(someCatalog);
container.ComposeExportedValue("first", new Number{Value = 2});
container.ComposeExportedValue("second", new Number{Value = 4});
var multi = container.GetExport<Multiplier>();
如何使用 DryIoc 做到这一点?
【问题讨论】:
标签: c# dependency-injection mef dryioc