我有A类和接口II接口。 我需要将2个成员IInterface注入A。
所以:
class A {
IInterface* i1;
IInterface* i2;
};
我可以使用水果DI框架将2个成员(i1和i2)注入A中吗?
答案 0 :(得分:9)
我是水果作者(感谢Alan指点我这个帖子!)。 注入该类的最简单方法是构造函数注入。假设这两个接口是相同的(如您的示例中所示)并且您需要2个不同的实例,则可以使用带注释的注入,如下所示:
using namespace fruit;
struct FirstI {};
struct SecondI {};
class A {
IInterface* i1;
IInterface* i2;
public:
INJECT(A(ANNOTATED( FirstI, IInterface*) i1,
ANNOTATED(SecondI, IInterface*) i2))
: i1(i1), i2(i2) {}
};
在get*Component()
函数中,您必须将两者绑定(对于相同类型或不同类型,两者完全独立,因为它们具有不同的注释):
class FirstIImpl : public IInterface {
....
public:
INJECT(FirstIImpl()) = default;
};
class SecondIImpl : public IInterface {
....
public:
INJECT(SecondIImpl()) = default;
};
Component<A> getAComponent() {
return createComponent()
.bind<fruit::Annotated< FirstI, IInterface>, FirstIImpl>()
.bind<fruit::Annotated<SecondI, IInterface>, SecondIImpl>();
}
注释注入是Fruit 2.x中的一项新功能,我还没有时间记录它(对不起)。希望上面的例子应该是你想要的,如果不让我知道的话。
如果要将两个接口绑定到同一类型,则还必须注释实现类,这样在注入图中将有2个节点(对象)而不是1.例如:
Component<A> getAComponent() {
return createComponent()
.bind<fruit::Annotated< FirstI, IInterface>,
fruit::Annotated< FirstI, IImpl>>()
.bind<fruit::Annotated<SecondI, IInterface>,
fruit::Annotated<SecondI, IImpl>>();
}