configuration - Lua:我可以使用 "require"作为依赖注入(inject)的一种形式吗?

标签 configuration dependency-injection lua loose-coupling

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

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

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

最佳答案

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

你现在在 Lua 中。没有具有显式和编译时固定原型(prototype)的类。函数是一流的对象;它们是值(value)观。所以以这种方式分解问题。

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

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

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

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

关于configuration - Lua:我可以使用 "require"作为依赖注入(inject)的一种形式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12344690/

相关文章:

wcf - WCF客户端端点:不带<dns>的SecurityNegotiationException

configuration - 无论如何要导出/导入所有 alfred 配置?

c++依赖注入(inject)来测试类系统调用的类

scala - Play和Scala的依赖注入(inject)框架?

c++ - 无法在Lua中加载c dll模块

.net - 如何在配置文件中指定程序集的确切位置

http - 如何激活 Wildfly 11 上的 AJP 端口?

c++ - 我可以用 native 代码扩展 Corona 吗?

java - GWT 项目中的单例

c++ - 在 C++ 中嵌入 Lua : linkage problems (liblua5. 1.a)