我正在尝试使用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);
}
随着wallaroo fooService
不再是全球性的。如何将其纳入BarUtils
? BarUtils
永远不会被实例化,但只有静态方法。
我正在尝试将calcSomething()
FooService
作为参数,但我失败了,因为Collaborator
无法转换为普通指针。
如果我传递参数Collaborator
本身,如果我已经有一个正常的指针指针,那将会有问题。我在服务中看到了这种情况。我必须传递的指针是this
指针,我无法将其转换为Collaborator
。
让调用者获取Foo
并将其提供给calcSomething()
也不是一个选项,因为获取对象的逻辑并不总是那么容易并且会复制逻辑。
有没有人经历过wallaroo如何做到这一点?
答案 0 :(得分:0)
我不是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类就像一个智能指针,所以你只需要调用&#34; - &gt;&#34;在它上面并使用它来调用FooService上的方法。