我正在构建一个可以以两种模式运行的应用程序。沙盒模式和生产模式。如何在erlang中更改gen_server的回调模块? (gen_server:swap_handler)
在沙箱模式下,我想在我的gen_server中对数据库进行很多检查:if table does not exist then create it;如果列不存在,则添加它;如果列类型不允许我想要存储的值,则更改它等。
在生产模式下,如果表不存在或列与值的类型不匹配,则会失败,没问题。
所以,为了避免繁琐的代码,如“case state#state.is_sandbox of true - > ...”, 我想为我的gen_server有两个不同的模块,并且我想更改current模块在handle_call或handle_info中。实际上,我只是想从沙箱转到生产,但我认为如果它以这种方式工作,它可能会倒退。
谢谢。
有了这个解决方案,我的服务器需要在每次调用时检查其Module变量的值,然后调用相应的函数。它工作,你不觉得它可能会很慢吗? – niahoo
您需要做的唯一事情就是从状态'#state {module = Module}'获取模块名称。您不必检查它是沙箱还是生产模块,您只需从该模块调用一个函数即可。我不认为它很慢 - 调用'Module:function'就像从不同的模块调用一个正常的函数。 – juro
从不同的模块,是的。我相信当编译器知道在编译时调用的模块时,编译器会优化调用。我会检查这个。有了你的解决方案,我将有3个模块,调用者和两个模块只有服务器端回调,这是相当不错的。 – niahoo