clojure - 根据字符串类名创建一条记录

标签 clojure domain-driven-design

我正在尝试创建一个事件存储,其中有一个类似这样的表:

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/

相关文章:

entity-framework - Linq-to-SQL 和 Entity Framework 在同一个项目中?

clojure - 有没有更好的方法来映射除第一项之外的所有项?

c# - 规范模式实现帮助

c# - DDD : (Domain And ViewModel)=> common Behaviors

clojure - 将字符串中的空格替换为逗号

design-patterns - 使用存储库模式处理集合的说明

design-patterns - 贫血域模型是否意味着您不能将实用程序/支持类用作域模型的 "helpers"?

clojure - 如何帮助Clojure理解0是最小的自然数?

Clojure记录: how to get hinted type given an attribute name

function - 如何在 Clojure 中对字符串向量进行双重循环?