如果我注册了同一个合约的两个实现,则使用 DryIoc - 在使用构造函数注入时如何控制使用哪个实现?
我看到您可以使用密钥或元数据注册 - 是否可以(使用属性?)通过注入实现来控制?或者我应该需要一个集合并找出ctor中的正确实现吗?
如果我注册了同一个合约的两个实现,则使用 DryIoc - 在使用构造函数注入时如何控制使用哪个实现?
我看到您可以使用密钥或元数据注册 - 是否可以(使用属性?)通过注入实现来控制?或者我应该需要一个集合并找出ctor中的正确实现吗?
您可以通过 Made.Of 强类型规范指定要在构造函数中使用的依赖项,如下所示:
container.Register<SomeClient>(Made.Of(
() => new SomeClient(Arg.Of<IDep>("service key of impl")));
这是带有更多选项的相关 SO 答案。
通过MEF Attributed Model支持属性注册:
[Export]
public class SomeClient {
public SomeClient([Import("x")]IDep dep) {}
}
[Export("x", typeof(IDep))]
public class X : IDep {}
[Export("y", typeof(IDep))]
public class Y : IDep {}
// in composition root:
using DryIoc.MefAttributedModel;
container = new Container().WithMefAttributedModel();
container.RegisterExports(
typeof(SomeClient),
typeof(X),
typeof(Y));
container.Resolve<SomeClient>(); // will inject X