我在为类编写有效配置时遇到问题。 假设我有:
interface IA{}
class abstract A : IA {}
class A1 : A, IA
{
private readonly IB _ib;
public A1(IB ib)
{
_ib = ib;
}
}
class A2 : A, IA
{
private readonly IB _ib;
public A1(IB ib)
{
_ib = ib;
}
}
我想把这些类注入其他人的构造函数中,我认为我没有问题,通过这样的方式做到这一点:
For<IEnumerable<IA>>.Use(x => x.AllInstances<A>());
但我不知道解决属性ib的问题,如果我想为A1类和A2类使用不同的_ib。
interface B{}
class B1 : B {}
class B2 : B {}
我知道如果我只有一个像B这样的班级和像A这样的班级,我可以简单地做这样的事情:
For<IA>().Use<ASample>().CTor<IB>().Is<BSample>();
但是我的问题是我尝试使用这样的东西:
For<IA>().ConditionallyUse(c => { c.If(t => t.ConcreteType == typeof(A1))
.ThenIt
.Is.ConstructedBy(by => new A1(by.InstanceOf<B1>()));
c.If(t => t.ConcreteType == typeof(A1))
.ThenIt
.Is.ConstructedBy(by => new A2(by.InstanceOf<B2>()));
});
但它给我一个双向注册的错误..
或许我应该考虑这样的事情:
For<IEnumerable<IA>>.Use(x => x.AllInstances<A>());
For<IEnumerable<IB>>.Use(x => x.AllInstances<B>());
但是使用这个变体我应该创建一个抽象类,以及另一个方法,只使用列表中的一个注入属性(对于从接口B继承的类)。
如果有人能帮助我,我将非常感激!
答案 0 :(得分:0)
我的问题的解决方法是写出类似的东西:
For<IA>().Add<A1>().CTor<IB>().Is<B1>();
For<IA>().Add<A2>().CTor<IB>().Is<B2>();
//and then
For<IEnumerable<IA>>.Use(x => x.GetAllInstances<IA>());