【发布时间】:2014-03-13 18:18:22
【问题描述】:
我想知道如何在数据映射器中给定 Java 的 ResultSet 对象来创建域模型。我阅读了 Martin Fowler 的书,在他的示例中,他将 ResultSet 中的每个字段加载到创建域模型的数据映射器方法中的局部变量中,然后将所有这些局部变量一一传递给域模型的构造函数。
问题在于它仅在表包含 2-5 列时才有效,否则您最终会得到 10+ 个局部变量和一个接受 10+ 个参数的构造函数。我不喜欢接受超过 5 个参数的构造函数或方法,10+ 太多了。更不用说我的域模型的构造函数也有依赖注入的参数,比如 UnitOfWork。总之,我不想弄乱构造函数的签名。
我有两种可能的解决方案,但似乎都有问题。我绝对可以将整个 ResultSet 传递给领域模型的构造函数,这样构造函数将只有 2-3 个参数。这里面还有一个问题,领域模型和领域层现在都知道ResultSet的存在了。据我所知,数据映射器应该充当域模型和结果集之间的中介。如果领域模型直接操纵结果集,那么它就是一个糟糕的架构设计。从长远来看,它会导致更多的问题。
我也可以先创建一个空域模型,然后使用它的 setter 方法向它的字段添加值。这种方法的问题在于,我有一个 UnitOfWork 监控域模型的状态为新的、脏的、已删除的或干净的。 UnitOfWork 的机制是,每当调用域模型的 setter 方法时,它将对象标记为脏并等待数据库更新。因此,使用空域模型 + setter 方法会导致每次调用 setter 时将对象标记为脏。尽管我可以在返回之前将域模型标记为干净,但当我加载对象集合时,整个过程仍然很慢。
那你怎么看?给定一个既优雅又不消耗资源的 Java ResultSet,是否有另一种方法来创建域模型?我没有想法......
【问题讨论】:
标签: design-patterns jdbc model domain-driven-design datamapper