Wallaroo依赖项和静态帮助程序类
wallaroo dependencies and static helper classes
我正在试验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
不再是全球性的。我怎样才能把它放进BarUtils
? BarUtils
从不实例化,只有静态方法。
我试图将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 上的方法。
- C++调用具有 *this 属性的单个帮助程序函数
- 用于检查值是否为其任何参数的帮助程序函数
- 类型限定宏帮助程序
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 无法将 2D 数组传递到 c++ 中的帮助程序函数中
- C2783: 无法推断帮助程序函数的模板参数
- 友元函数需要一个帮助程序函数
- 在何处放置与类方法相关的帮助程序函数C++
- 给定概念,SFINAE 帮助程序是否仍在规范中作为未弃用?
- 使用 IP 帮助程序的 Windows 中活动 UDP 连接的远程地址
- 如何安装性能数据帮助程序
- 用于向公众公开数据成员的帮助程序结构
- 类参数化与类和帮助程序函数混淆
- 仅具有公共静态方法的帮助程序类
- Ebpf:帮助程序的未定义符号
- 函数和指针帮助:程序生成,但崩溃,没有任何特定错误
- 使用带有 MEX 包装器的帮助程序 C 文件从 MATLAB 2016 调用C++代码时出现问题
- 输入到字符串流并在单个语句中转换为字符串.可以没有帮助程序类
- Wallaroo依赖项和静态帮助程序类
- 静态帮助程序类