在Component中,在系统启动时创建配置的最佳模式是什么?

时间:2016-11-18 16:05:26

标签: clojure components state

我还没有想到Component的模式:

我有一些"生活"需要system-start上的磁盘IO(一个组件)的配置,并且依赖于静态配置(.edn)的映射,并在此之后" live"配置被实例化,它不再发生变化或副作用。

例如:我需要设置一次,这取决于静态配置:

(buddy.core.backends/jws 
  {:secret (buddy.core.keys/public-key 
       path-to-public-key-from-static-config)})

然后我会重复使用后端ad-infinitum,(例如:buddy.auth.middleware/wrap-authentication),它不会改变,也不会产生副作用。

可能的解决方案

  1. 我可以创建一个将此后端存储在system-start的组件。但这放弃了普遍性,因为当我想添加类似的" live config"时,它必须被明确地写入组件中,并且放弃了我认为组件支持的普遍性精神(例如{ {1}}组件定义了副作用,并创建了访问它们的边界)

  2. 我可以将通用组件传递给Duct - keys的地图,并对fn + args进行评估并存储在组件中。但这感觉就像它将计算卸载到我的配置.edn,并且是一种反模式。例如:

    [fn & args]

    我应该在我的.edn配置中编码(private-key priv-path-from-static (slurp :password-path-from-static))的概念吗?我不想将计算卸载到配置文件...

  3. 后端和密钥可以根据需要实例化 每个需要它们的组件。 IMO,当我把它存储在内存中时,计算完全相同的东西太多了。

  4. 我可以拥有一个slurp组件,其中包含这些" live"配置对象,但随后它们被破坏性地添加,我的代码已经失去了它的声明性质。

  5. TL; DR

    atom创建配置的最佳方法是什么,可能需要依赖项,然后可以将作为组件用于其他组件,同时不放弃通用性组件应该有?

1 个答案:

答案 0 :(得分:0)

在理想的世界中,我认为组件本身应该描述它需要什么类型的配置数据。 (这可以通过扩展相关组件的协议来完成。)。当配置组件启动时,它应该查看所有其他组件,获取配置要求列表并以某种方式解决它(从文件,数据库等)。

我没见过这样的图书馆,但是Aviso's config library很接近,也许你可以根据自己的需要调整它。