2

我正在设计一个医院集成系统,它使用来自不同医院(我们的客户)的数据,然后根据从数据库读取配置将特定的业务规则应用于所述数据。如果我使用 Java,我的第一直觉是构建一系列代表各种业务规则的接口,然后注入具体实例(使用 Spring/guice)来组成一个完全配置的对象。这将使我能够在配置逻辑(哪些 biz 规则应该适用于 Hospital Foo?)和实际业务规则本身之间实现清晰的分离。

不幸的是,我没有使用 Java,我使用的是 Lua。在过去的几天里,我沉浸在 Lua 文献中,与 DI 最接近的模拟似乎是模块的使用。此外,管理如何在运行时解析 lua 模块的规则似乎完全基于询问本地文件系统。

“模块模式”是实现我所追求的最佳/唯一方法(将配置逻辑与 biz 逻辑分离)?如果是这样,如何利用 Lua 的模块加载规则来改变在运行时加载的实际模块?

4

1 回答 1

9

第 1 步:停止像 Java 程序员那样思考。

你现在在Lua中。没有具有显式和编译时固定原型的类。函数是一等对象;他们是价值观。因此,以这种方式分解问题。

你有一堆“规则”(即:函数)。您希望将其中一些规则应用于某些数据。您有一个配置系统,上面写着“在将规则应用于位置 X 的数据时,请使用这组规则”。所以……这样做。

您检测到数据来自位置 X。因此,您调用配置逻辑为位置 X 构建 Lua 表,其中包含要应用于该数据的规则(即:函数)。位置 X 的配置逻辑从它们存储的任何地方加载规则,然后返回它们。如果配置在数据库或其他东西中,那么位置 X 的数据库条目可能会按名称引用规则。

如何将该规则名称转换为实际的 Lua 函数取决于您,但有很多方法。您可以有一个注册表,将目录中的所有 Lua 文件预加载到表中,然后根据该表中的名称选择规则。或者你有一个名为 Lua 文件/脚本的数据库,每个文件/脚本都是一个单独的规则。有许多方法可以实现这一点。

在 Lua 中,“依赖注入”只是“决定如何构建函数集合”。这并不是什么特别的事情,因为 Lua 是一种比 Java 更自由的语言。只是函数来自哪里,如何将它们放在一个表中,然后如何将该表应用于某些数据的问题。所有这些都取决于你。

于 2012-09-10T02:53:35.677 回答