如何强制使用直接类结构图

时间:2015-07-21 18:56:47

标签: c# dependency-injection structuremap

我在为类编写有效配置时遇到问题。 假设我有:

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继承的类)。

如果有人能帮助我,我将非常感激!

1 个答案:

答案 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>());