1

我有以下(简化的)架构:

客户端-->保镖-->服务器

客户端向服务器发送命令。'bouncer' 对客户端发出的命令执行完整性检查和其他检查,并防止错误命令到达服务器。例如,保镖可能有以下代码:

bool Bouncer::someCommand(const someCommandArg& arg) {
    if (arg.x < 100) {
        return false;                              
    }

    if (arg.y > 10) {
        return false;
    }
    // more checks ...

        return server->someCommand(arg);
}

这种方法的问题在于,保镖条件必须一一硬编码,并且不够灵活。我正在寻找一种在某些配置文件中定义这些条件的方法,保镖将在创建时加载这些条件,并在someCommand调用时循环遍历所有条件。此外,测试循环本身必须很快。

如果是 C#,我想我会使用它的 compile-on-the-fly 功能,并if在配置文件中用纯代码编写我的子句。你对 C++ 有什么建议?

4

2 回答 2

2

选择包括:

  • 创建一个解释环境,将传入消息的可测试方面传达给它,并从您的配置中加载一些谓词表达式/函数以进行评估
    • 嵌入一​​种语言(例如 LUA、ruby)
    • 下载许多更简单的表达式评估库中的任何一个
    • 创建自己的(也许使用 boost Spirit)
  • 让保镖使用 dlopen/dlsym 等以共享对象(.so、.dll - 无论您的操作系统如何称呼它们)的形式加载谓词。
    • 只有谓词/规则需要重新编译
    • 不需要将整个应用程序源分发给想要指定谓词的用户
    • 相当快的谓词执行

什么是最好的很大程度上取决于有用谓词的复杂性、性能要求、部署实践等。

于 2011-03-03T08:33:38.337 回答
0

您可以使用插件方法。使保镖成为插件,然后使用管道/责任链模式将命令传递给多个保镖?不同的保镖插件可以检查不同的条件,并通过链接它们,定义应用于命令的最终规则。您可以使用配置文件来指定应加载哪些插件以及如何设置链。

这仍然意味着必须先编译插件才能加载它们,但如果确实需要,您可以在程序运行时动态加载它们。至少添加新插件不需要重新编译您的应用程序。

于 2011-03-03T07:50:06.633 回答