Lua:我可以使用"require"作为依赖注入的形式吗?

Mit*_*h A 2 configuration lua dependency-injection loose-coupling

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

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

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

Nic*_*las 9

第1步:停止像Java程序员一样思考.

你现在在Lua.没有具有显式和编译时固定原型的类.函数是一流的对象; 他们是价值观.所以以这种方式解决问题.

你有一堆"规则"(即:函数).您希望将某些规则应用于某些数据.您有一个配置系统,"当将规则应用于位置X的数据时,请使用这组规则." 所以......那样做.

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

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

在Lua中,"依赖注入"只是"决定如何构建函数集合".这不是一件特别的事,因为Lua是一种比Java更自由的语言.这只是函数的来源,如何将它们放在一个表中,然后如何将该表应用于某些数据.所有这些都取决于你.

  • 我如何在没有DI的情况下进行单元测试?现在我正在测试一个依赖于luasocket的模块,而且我不负责集成测试.我真的想要模拟luasocket对象,但是我需要在模块的第一行中使用它.如果它可以被其他人传递我会很有趣...当然我可以将它作为参数传递,但它看起来很奇怪:csclient.connect('0.0.0.0','9000',require('socket') )) (3认同)