我想知道如何在数据映射器中使用Java的ResultSet对象创建域模型。我阅读了Martin Fowler的书,在他的例子中,他将ResultSet中的每个字段加载到数据映射器方法中的局部变量中,该方法创建域模型,然后将所有这些局部变量逐个传递给域模型的构造函数。
问题是它只有在表包含2-5列时才有效,否则最终会有10个以上的局部变量和一个接受10多个参数的构造函数。我不喜欢接受超过5个参数的构造函数或方法,10 +太多了。没有提到我的域模型的构造函数也有依赖注入的参数,比如UnitOfWork。总之,我不想弄乱构造函数的签名。
我有两种可能的解决方案,但两者似乎都有问题。我绝对可以将整个ResultSet传递给域模型的构造函数,这样构造函数只会有2-3个参数。这也涉及到一个问题,域模型和域层现在意识到ResultSet的存在。据我所知,数据映射器应该充当域模型和结果集之间的中介。如果域模型直接操作结果集,那么它是一个糟糕的架构设计。从长远来看,它会导致更多问题。
我还可以先创建一个空域模型,然后使用其setter方法向其字段添加值。这种方法的问题在于,我有一个UnitOfWork监视域模型的状态为new,dirty,removed或clean。 UnitOfWork的机制是,无论何时调用域模型的setter方法,它都会将对象标记为脏并且等待DB更新。因此,使用空域模型+ setter方法会导致每次调用setter时对象都被标记为脏。尽管我可以在返回之前将域模型标记为干净,但是当我加载对象集合时,整个过程仍然很慢。
那你觉得怎么样?在给定优雅且不消耗资源的Java ResultSet的情况下,是否有另一种方法来创建域模型?我没有想法......