Wallaroo依赖项和静态帮助程序类

wallaroo dependencies and static helper classes

本文关键字:帮助程序 静态 依赖 Wallaroo      更新时间:2023-10-16

我正在试验Wallaroo依赖注入库来摆脱我的全局变量。我遇到的一个问题是如何让我的静态助手再次工作。简化我的代码看起来像那样

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

有了瓦拉鲁fooService不再是全球性的。我怎样才能把它放进BarUtilsBarUtils从不实例化,只有静态方法。

我试图将calcSomething() FooService作为参数,但我失败了,因为Collaborator无法转换为普通指针。

如果我将参数传递给Collaborator本身,那么如果我已经有一个指向某物的正常指针,那将是有问题的。我在服务时看到了这种情况。在那里,我必须传递的指针是this指针,我无法将其投射到Collaborator
让调用方获取Foo并将其提供给calcSomething()也不是一种选择,因为获取对象的逻辑并不总是那么容易,并且会重复逻辑。

有没有人在瓦拉鲁体验过如何做到这一点?

我不是 Wallaroo 的用户,但我过去曾尝试过。与往常一样,我解决了构造函数注入的所有问题。您将不再需要全局变量和静态方法。

诀窍是摆脱所有全局变量和静态,并用类替换它们。然后 IoC 框架负责创建所需类的实例并传播依赖项(如果 A 需要 B 的实例而您只请求 A,则框架也会自动生成 B(

你只有一个引用FooService的BarUtils实例,这很容易用任何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,因为有太多的字符串处理(将目录创建为字符串,所有类型都是字符串等(,但是Wallaroo允许做其他IoC无法实现的某些事情。主要问题是你的案例真的是一个简单的案例,使用其他框架很容易做到,如果你以前从未使用过依赖注入,Wallaroo 我第一次会感到不知所措。

Collaborator 类的作用类似于一个智能指针,因此您只需在其上调用"->",并将其用于调用 FooService 上的方法。