我正在尝试创建一个事件存储,其中有一个类似这样的表:
CREATE TABLE domain_events (
id serial PRIMARY KEY,
timestamp timestamptz,
entity_id int,
type text,
data jsonb
);
我有一个像这样的命名空间
(ns my-domain.domain-events)
(defrecord PurchaseOrderCreated
[id timestamp purchase-order-id created-by])
(defrecord PurchaseOrderCancelled
[id timestamp purchase-order-id cancelled-by])
因此 type
是完全限定类名的字符串名称,例如 my_domain.domain_events.PurchaseOrderCreated
,它来自获取 type
> 来自记录,例如(类型(->PurchaseOrderCreated))
。我应该注意到 (type the-event)
实际上会生成一个以 class
为前缀的字符串,例如 class my_domain.domain_events.PurchaseOrderCreaated
所以我正在修剪在存储到数据库之前将其关闭。
我正在尝试弄清楚如何从数据库中检索这些事件行并将它们重新水化为域事件。我觉得我已经很接近了,但只是还没能获得所有的碎片。
我尝试使用new
来构造新记录,但我似乎很难将字符串类名转换为记录。
(new (resolve (symbol "my_domain.domain_events.PurchaseOrderCreated")) prop1 prop2 ...)
另外,我不确定使用 new
有多容易,因为我的 array-of-properties
需要采用正确的顺序。使用 map->PurchaseOrderCreated
可能会更好,但我仍然不确定如何根据字符串类名动态解析此构造函数。
有人可以建议这里最好的方法是什么吗?
最佳答案
以下内容应该有效,但我不会显示是否有更惯用的方法:
((resolve (symbol "my_domain.domain_events"
(str "map->"
"PurchaseOrderCreated")))
{:id 123})
symbol
需要花费 ns
:
https://clojuredocs.org/clojure.core/symbol
关于clojure - 根据字符串类名创建一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65029492/