StructureMap - 如何在不同类的构造函数中创建接口的不同实例(通过不同的构造函数值)

时间:2017-12-18 19:08:50

标签: c# structuremap

我有这个类和接口:

Public interface IBook{
}

public class Book:IBook
{
    public Book(int num){
        //...
    }
}

//------------------------------------------------------

Public interface IBox{
}

Public interface IBoxA:IBox{
}

Public interface IBoxB:IBox{
}

Public interface IBoxC:IBox{
}

//------------------------------------------------------

public class Box1:IBoxA
{
    public Box1(IBook myBook, ..........){
        //...
    }
}

public class Box2:IBoxB
{
    public Box2(IBook myBook, ..........){
        //...
    }
}

public class Box3:IBoxC
{
    public Box3(IBook myBook, ..........){
        //...
    }
}

我想将Book对象传递给Box1Box2&的构造函数。 Box3来自StructureMap IOC,但每个人在构造函数中应该有不同的值。

我真的想要一种机制来确定女巫Book对象(女巫参数值)应该传递给女巫Box类。这是实例Box类的条件。

有关更好的说明,请参阅下图:

enter image description here

我写下面的配置:

For<IBoxA>()
   .HybridHttpOrThreadLocalScoped()
   .Use<Box1>();

For<IBoxB>()
   .HybridHttpOrThreadLocalScoped()
   .Use<Box2>();

For<IBoxC>()
   .HybridHttpOrThreadLocalScoped()
   .Use<Box3>();

ForConcreteType<Box1>()
        .Configure
        .Ctor<IBook>("myBook")
        .Is(new Book(1));

ForConcreteType<Box2>()
        .Configure
        .Ctor<IBook>("myBook")
        .Is(new Book(2));

ForConcreteType<Box3>()
        .Configure
        .Ctor<IBook>("myBook")
        .Is(new Book(3));

但实际上Box1Box2Box3在其构造函数中有许多参数,其中一个是IBook myBook。我不知道如何将配置设置为仅使用适当的对象在myBookBox1Box2的构造函数中设置Box3参数。

EDIT1:

我真正的项目是不同的,我试图通过减少名称和它的关系来简化我的问题,然后我可能在实际项目中有一些错误,但我得到一个类似的错误:

No default Instance is registered and cannot be automatically determined for type 'IBook' There is no configuration specified for 'IBook'。我应该在上面的场景中为IBook定义另一个配置吗?

我的代码还没有 IBook»»Book的另一个配置,因为Book有一个带参数的构造函数,其参数的值取决于where(在女巫Box中)它是。

1 个答案:

答案 0 :(得分:2)

我不确定在你的真实例子中出了什么问题,但总的来说你只需要:

c.For<IBoxA>()                    
    .Use<Box1>()
    .Ctor<IBook>().Is(new Book(1));

c.For<IBoxB>()                    
    .Use<Box2>()
    .Ctor<IBook>().Is(new Book(2));

c.For<IBoxC>()                    
    .Use<Box3>()
    .Ctor<IBook>().Is(new Book(3));

使用界面解析(所以IBoxB而不是Box2):

var box = container.GetInstance<IBoxB>();