Clojure 在组件中,什么';在系统启动时创建配置的最佳模式是什么?
对于组件,我还没有找到一种模式: 我有一些“实时”配置,需要在Clojure 在组件中,什么';在系统启动时创建配置的最佳模式是什么?,clojure,components,state,Clojure,Components,State,对于组件,我还没有找到一种模式: 我有一些“实时”配置,需要在系统开始时使用磁盘IO(一个组件),并且依赖于静态配置(.edn)的映射,在这个“实时”配置被实例化之后,它将不再改变或产生任何副作用 例如:我需要设置一次,这取决于静态配置: (buddy.core.backends/jws {:secret (buddy.core.keys/public-key path-to-public-key-from-static-config)}) 然后,我将无限期地重用该后端(
系统开始时使用磁盘IO(一个组件),并且依赖于静态配置(.edn)的映射,在这个“实时”配置被实例化之后,它将不再改变或产生任何副作用
例如:我需要设置一次,这取决于静态配置:
(buddy.core.backends/jws
{:secret (buddy.core.keys/public-key
path-to-public-key-from-static-config)})
然后,我将无限期地重用该后端(例如:在buddy.auth.middleware/wrap authentication
),它不会改变,也不会产生副作用
可能的解决方案
我可以制作一个组件,在系统启动时存储这个后端。但这就放弃了通用性,因为当我想添加类似的“实时配置”时,它必须显式地写入组件中,这就放弃了我认为组件拥护的通用性精神(例如风管说组件定义副作用,并创建边界来访问它们)
我可以向一个通用组件传递一个键的映射
-[fn&args]
,然后对fn+args进行评估并存储在组件中。但这感觉像是将计算卸载到我的configuration.edn中,是一种反模式。例如:
(来自静态的私钥私有路径)
(slurp:来自静态的密码路径))
我应该在.edn配置中对slurp
ing的概念进行编码吗?我不想将计算转移到配置文件中
后端和密钥可以根据需要在需要它们的每个组件中实例化。依我看,这是太多的计算完全相同的事情,当我宁愿它被存储在内存中一次
我可以有一个atom
组件来保存这些“活动”配置对象的映射,但随后它们被破坏性地添加进来,我的代码就失去了它的声明性质
TL;博士
在系统启动时创建配置的最佳方法是什么?可能需要依赖项,然后作为组件提供给其他组件,同时不放弃组件应有的通用性?在理想情况下,我认为组件本身应该描述它需要的配置数据类型。(这可以通过扩展相关组件的协议来实现。)。当配置组件启动时,它应该查看所有其他组件,获取配置需求列表并以某种方式(从文件、数据库等)解决它
我还没有见过这样的库,但很接近,也许您可以根据自己的需要调整它。在理想情况下,我认为组件本身应该描述它需要什么类型的配置数据。(这可以通过扩展相关组件的协议来实现。)。当配置组件启动时,它应该查看所有其他组件,获取配置需求列表并以某种方式(从文件、数据库等)解决它
我还没有见过这样的图书馆,但很接近,也许你可以根据自己的需要调整它。我不明白为什么1。会失去一般性。这可能是因为您没有发布任何系统/组件示例代码——您能详细说明一下吗?组件不必有副作用,无论哪种方式读取都是副作用。最后,组件通常是以期望“完全买进”的价格出现的,因此您通常会得到一个组件树。解决你的问题;DR question:创建一个单独的组件,该组件需要参数(由组件作为组件映射提交),在component/start
上执行其操作(读取、DB等),并返回一个组件供其他组件使用。我不明白为什么1。会失去一般性。这可能是因为您没有发布任何系统/组件示例代码——您能详细说明一下吗?组件不必有副作用,无论哪种方式读取都是副作用。最后,组件通常是以期望“完全买进”的价格出现的,因此您通常会得到一个组件树。解决你的问题;DR question:创建一个单独的组件,该组件需要参数(由组件作为组件映射提交),在component/start
上执行它的操作(读取、DB等),并返回一个组件供其他组件使用。