如何使用直接 class 结构图进行强制
How to coerce using direct class structuremap
我在为 classes 编写有效配置时遇到问题。
假设我有:
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;
}
}
我想将这个 classes 注入到其他人的构造函数中,我认为我对此没有问题,通过这样的方式来做到这一点:
For<IEnumerable<IA>>.Use(x => x.AllInstances<A>());
但我不知道如何解决 属性 ib 的问题,如果我想对 class A1 和 class A2 使用不同的 _ib。
interface B{}
class B1 : B {}
class B2 : B {}
我知道如果我只有一个 class 像 B 和 class 像 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>());
但是对于这个变体,我应该创建一个抽象 class,以及一个仅使用列表中注入的 属性 的附加方法(对于从接口 B 继承的 classes ).
如果有人能帮助我,我将不胜感激!
我的问题的解决方案是写这样的东西:
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>());
我在为 classes 编写有效配置时遇到问题。 假设我有:
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;
}
}
我想将这个 classes 注入到其他人的构造函数中,我认为我对此没有问题,通过这样的方式来做到这一点:
For<IEnumerable<IA>>.Use(x => x.AllInstances<A>());
但我不知道如何解决 属性 ib 的问题,如果我想对 class A1 和 class A2 使用不同的 _ib。
interface B{}
class B1 : B {}
class B2 : B {}
我知道如果我只有一个 class 像 B 和 class 像 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>());
但是对于这个变体,我应该创建一个抽象 class,以及一个仅使用列表中注入的 属性 的附加方法(对于从接口 B 继承的 classes ).
如果有人能帮助我,我将不胜感激!
我的问题的解决方案是写这样的东西:
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>());