gpt4 book ai didi

带有水果的 C++ 依赖注入(inject)

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:25:23 25 4
gpt4 key购买 nike

我有 A 类和接口(interface) IInterface。我需要将 2 个成员 IInterface 注入(inject) A。

所以:

class A {
IInterface* i1;
IInterface* i2;
};

我可以使用 fruit DI 框架将 2 个成员(i1 和 i2)注入(inject)到 A 中吗?

最佳答案

我是 Fruit 的作者(感谢 Alan 指点我这个话题!)。注入(inject)该类的最简单方法是构造函数注入(inject)。假设这两个接口(interface)是相同的(如在您的示例中)并且您想要 2 个不同的实例,您可以使用带注释的注入(inject),它看起来像:

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() 函数中,您必须绑定(bind)两者(绑定(bind)到相同类型或不同类型,两者完全独立,因为它们具有不同的注释):

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

注释注入(inject)是 Fruit 2.x 中的一个新特性,我还没有时间记录它(抱歉)。希望上面的示例应该是您想要的,如果没有请告诉我。

如果你想将两个接口(interface)绑定(bind)到相同的类型,你还必须注释实现类,这样你将在注入(inject)图中有 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>>();
}

关于带有水果的 C++ 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37099317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com