Lua: 我可以把 "require" 当作一种依赖注入的形式吗?

我正在设计一个医院集成系统,该系统从各个医院(我们的客户)消耗数据,然后根据从数据库中读取的配置应用特定的业务规则到该数据上。如果我使用Java,我的第一直觉是构建代表各种业务规则的一系列接口,然后注入具体实例(使用Spring/guice)来组合一个完全配置的对象。这将允许我在配置逻辑(什么业务规则应该应用于医院Foo?)和实际业务规则之间实现清晰的分离。

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

"模块模式"是实现我想要的(配置逻辑与业务逻辑的分离)最好/唯一的方法吗?如果是这样,如何利用Lua的模块加载规则来在运行时改变实际加载的模块?

点赞
用户734069
用户734069

第一步: 不要再像Java程序员那样思考。

现在你在使用 _Lua_。这里没有固定原型的类,也没有显式的编译。函数是第一类的对象,它们是_值_。所以以这种方式分解问题。

你有一堆“规则”(即函数)。 你想要将其中一些规则应用于某些数据。 你有一个配置系统,它说:“将规则应用于来自位置X的数据时,请使用这组规则。” 所以…这样做。

你检测到数据来自位置X。 所以你调用你的配置逻辑来为位置X建立一个包含要应用于该数据的规则(即函数)的Lua表。 位置X的配置逻辑从存储它们的任何位置加载规则,并返回它们。 如果配置在数据库之类的地方,那么位置X的数据库条目可能会按名称引用规则。

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

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

2012-09-10 02:53:35