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等),并返回一个组件供其他组件使用。