我有这个类和接口:
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对象传递给Box1
,Box2
&的构造函数。 Box3
来自StructureMap
IOC,但每个人在构造函数中应该有不同的值。
我真的想要一种机制来确定女巫Book
对象(女巫参数值)应该传递给女巫Box
类。这是实例Box
类的条件。
有关更好的说明,请参阅下图:
我写下面的配置:
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));
但实际上Box1
,Box2
和Box3
在其构造函数中有许多参数,其中一个是IBook myBook
。我不知道如何将配置设置为仅使用适当的对象在myBook
,Box1
和Box2
的构造函数中设置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
中)它是。
答案 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>();