Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ wallaroo依赖项和静态助手类_C++_Pointers_Dependency Injection - Fatal编程技术网

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);
}
随着wallaroo
fooService
不再是全球性的。如何将其放入
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是你唯一的选择。