如何使用直接 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>());