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

时间:2014-11-29 09:08:56

标签: c++ pointers dependency-injection

我正在尝试使用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不再是全球性的。如何将其纳入BarUtilsBarUtils永远不会被实例化,但只有静态方法。

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

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

有没有人经历过wallaroo如何做到这一点?

1 个答案:

答案 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上的方法。