C++ wallaroo依赖项和静态助手类
我正在试验依赖注入库,以摆脱我的全局变量。 我遇到的一个问题是如何使我的静态助手再次工作。简化我的代码看起来是这样的C++ wallaroo依赖项和静态助手类,c++,pointers,dependency-injection,C++,Pointers,Dependency Injection,我正在试验依赖注入库,以摆脱我的全局变量。 我遇到的一个问题是如何使我的静态助手再次工作。简化我的代码看起来是这样的 // FooService.h class FooService { public: Foo* getSomeFoo(int x); } // BarUtils.h class BarUtils { public: static double calcSomething(int x, int a, int b); } // BarUtils.cpp exter
// FooService.h
class FooService {
public:
Foo* getSomeFoo(int x);
}
// BarUtils.h
class BarUtils {
public:
static double calcSomething(int x, int a, int b);
}
// BarUtils.cpp
extern FooService* fooService;
double BarUtils::calcSomething(int x, int a, int b) {
// need a Foo, so I call the globally available service
Foo* foo = fooService->getSomeFoo(x);
return doMagic(foo, a, b);
}
随着wallaroofooService
不再是全球性的。如何将其放入BarUtils
BarUtils
从未实例化,但只有静态方法
我试图将calcSomething()
FooService作为一个参数,但我失败了,因为协作者无法转换为普通指针
如果我将参数传递给Collaborator
本身,如果我已经有一个指向某个对象的普通指针,那么它就会有问题。我在服役时见过这个案子。在那里,我必须传递的指针是这个
指针,我不能将它转换为合作者
让调用方获取Foo
并将其交给calcSomething()
也不是一个选项,因为获取对象的逻辑并不总是那么容易,而且会复制逻辑
有没有人在wallaroo中有过如何做到这一点的经验?我不是wallaroo的用户,但我曾经尝试过。像往常一样,我用构造函数注入解决每个问题。您将不再需要全局变量和静态方法
诀窍是去掉所有全局变量和静态变量,并用类替换它们。然后IoC框架负责创建所需类的实例并传播依赖关系(如果A需要B的实例,而您只要求A,那么框架也会自动生成B)
您只需要一个BarUtils wich reference FooService实例,这对于任何IoC容器都很容易做到,Wallaroo解决方案将是:
#include "wallaroo/registered.h"
using namespace wallaroo;
class BarUtils: public Part
{
public:
BarUtils( const string& color );
private:
Collaborator< FooService> myFooService;
};
//other sintactic sugar to get FooService instanced.
#包括“wallaroo/registered.h”
使用名称空间wallaroo;
BarUtils类:公共部分
{
公众:
BarUtils(常量字符串和颜色);
私人:
合作者myFooService;
};
//其他用于获取FooService实例的烧结糖。
就我个人而言,我不太喜欢Wallaroo,因为有太多的字符串处理(创建一个目录作为字符串,所有类型都是字符串等等),但是Wallaroo允许做一些其他IOC不可能做的事情。主要的问题是,您的案例实际上是一个简单的案例,对于其他框架来说很容易做到,如果您以前从未使用过依赖注入,那么Wallaroo my在第一次使用时可能会非常强大
协作器类就像一个智能指针,因此您可以在它上面调用“->”,并使用它来调用FooService调用方法。
WalAROO使用字符串,因为这是做配置驱动布线的唯一方法:-其他C++框架/库提供编译时依赖性注入(即,您可以在编译时定义您的类型)编译时间很好。因为C++不是C添加运行时配置,所以会增加更多的麻烦。在这一点上,如果编译时间DI很好,则另一种语言更好。您可以使用其他框架;另一方面,如果需要配置驱动的布线[运行时!]在C++中,wallaroo是你唯一的选择。