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

StructureMap - How to make different instances of an interface (by different constructor values) for use in constructor of different classes

我有这个 class 和接口:

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, ..........){
        //...
    }
}

我想通过 StructureMap IOC 将 Book 对象传递给 Box1Box2Box3 的构造函数,但每个对象在其构造函数中都应具有不同的值。

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

为了更好的解释请看下图:

我写了以下配置:

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。我不知道如何设置配置以在 Box1Box2Box3 的构造函数中使用适当的对象设置 myBook 参数。


编辑1:

我的真实项目不同,我试图通过减少名称和关系来简化我的问题,那么我可能在真实项目中有一些错误,但我得到了这样的错误:

No default Instance is registered and cannot be automatically determined for type 'IBook' There is no configuration specified for 'IBook'。在上述情况下,我应该为 IBook 定义另一个配置吗?

我的代码 没有 IBook 的另一个配置 »» Book 因为 Book 有一个带有参数和参数值的构造函数取决于它所在的位置(在 Box 中)。

我不确定在你的真实例子中哪里出了问题,但一般来说你需要的是:

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