如何在没有全局变量的情况下避免 lua 中的循环依赖?
How to avoid circular dependency in lua without global variables?
我正在使用 OpenResty,我的应用设置为:
app/
clients/
photoClient.lua
init.lua
auth.lua
假设photoClient
同时具有未验证和已验证的端点(类似于无需登录即可访问的头像端点,但可能有您需要先登录的私人照片)
所以在依赖方面,我有:
-- auth.lua
local photoClient = require('app.clients.photoClient')
-- this is used to show avatar on the login page
local auth = {}
auth.isAuthenticated = function ()
-- logic to check authentication
end
return auth
客户是
-- photoClient.lua
local auth = require('app.auth')
local photoClient = {}
photoClient.privateEndpoint = function()
if (!auth.isAuthenticated()) {
ngx.exit(403)
}
...
end
photoClient.getAvator = function() {
-- this is a public method used by auth
}
return photoClient
这是一个循环依赖问题。我在 other SO post 上看到您可以使用全局变量,即 photoClient = photoClient or require('app.clients.photoClient')
但我不想使用全局变量,并且希望每个模块都限定在其自身范围内。
我该怎么做?
在 Kate Adams 的 LuaFlare 文档中找到解决方案:基本上在对每个文件执行 return your_module
之前添加 package.loaded[...] = your_module
,即
-- auth.lua
local auth = {}
package.loaded[...] = auth
local photoClient = require('app.clients.photoClient')
...
return auth
-- photoClient.lua
local photoClient = {}
package.loaded[...] = photoClient
local auth = require('app.auth')
...
return photoClient
已解决问题。 Here is the link 任何有兴趣阅读更多内容的人都可以访问本书的页面。
两个主要解决方案:
拆分
将 auth 分成两个处理不同方面的模块:一个用于 photoClient 可能使用的公共逻辑的 auth 模块和一个作为登录页面的登录模块。
此解决方案将防止在您需要使用身份验证的其他情况下出现同样的问题。
注入
在拥有这两个模块的父代码 (init.lua) 中,将一个注入另一个(调用传递模块的函数)。
我正在使用 OpenResty,我的应用设置为:
app/
clients/
photoClient.lua
init.lua
auth.lua
假设photoClient
同时具有未验证和已验证的端点(类似于无需登录即可访问的头像端点,但可能有您需要先登录的私人照片)
所以在依赖方面,我有:
-- auth.lua
local photoClient = require('app.clients.photoClient')
-- this is used to show avatar on the login page
local auth = {}
auth.isAuthenticated = function ()
-- logic to check authentication
end
return auth
客户是
-- photoClient.lua
local auth = require('app.auth')
local photoClient = {}
photoClient.privateEndpoint = function()
if (!auth.isAuthenticated()) {
ngx.exit(403)
}
...
end
photoClient.getAvator = function() {
-- this is a public method used by auth
}
return photoClient
这是一个循环依赖问题。我在 other SO post 上看到您可以使用全局变量,即 photoClient = photoClient or require('app.clients.photoClient')
但我不想使用全局变量,并且希望每个模块都限定在其自身范围内。
我该怎么做?
在 Kate Adams 的 LuaFlare 文档中找到解决方案:基本上在对每个文件执行 return your_module
之前添加 package.loaded[...] = your_module
,即
-- auth.lua
local auth = {}
package.loaded[...] = auth
local photoClient = require('app.clients.photoClient')
...
return auth
-- photoClient.lua
local photoClient = {}
package.loaded[...] = photoClient
local auth = require('app.auth')
...
return photoClient
已解决问题。 Here is the link 任何有兴趣阅读更多内容的人都可以访问本书的页面。
两个主要解决方案:
拆分
将 auth 分成两个处理不同方面的模块:一个用于 photoClient 可能使用的公共逻辑的 auth 模块和一个作为登录页面的登录模块。
此解决方案将防止在您需要使用身份验证的其他情况下出现同样的问题。
注入
在拥有这两个模块的父代码 (init.lua) 中,将一个注入另一个(调用传递模块的函数)。