我还没有想到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
),它不会改变,也不会产生副作用。
我可以创建一个将此后端存储在system-start
的组件。但这放弃了普遍性,因为当我想添加类似的" live config"时,它必须被明确地写入组件中,并且放弃了我认为组件支持的普遍性精神(例如{ {1}}组件定义了副作用,并创建了访问它们的边界)
我可以将通用组件传递给Duct
- keys
的地图,并对fn + args进行评估并存储在组件中。但这感觉就像它将计算卸载到我的配置.edn,并且是一种反模式。例如:
[fn & args]
我应该在我的.edn配置中编码(private-key priv-path-from-static
(slurp :password-path-from-static))
的概念吗?我不想将计算卸载到配置文件...
后端和密钥可以根据需要实例化 每个需要它们的组件。 IMO,当我把它存储在内存中时,计算完全相同的东西太多了。
我可以拥有一个slurp
组件,其中包含这些" live"配置对象,但随后它们被破坏性地添加,我的代码已经失去了它的声明性质。
在atom
创建配置的最佳方法是什么,可能需要依赖项,然后可以将作为组件用于其他组件,同时不放弃通用性组件应该有?
答案 0 :(得分:0)
在理想的世界中,我认为组件本身应该描述它需要什么类型的配置数据。 (这可以通过扩展相关组件的协议来完成。)。当配置组件启动时,它应该查看所有其他组件,获取配置要求列表并以某种方式解决它(从文件,数据库等)。
我没见过这样的图书馆,但是Aviso's config library很接近,也许你可以根据自己的需要调整它。