我正在使用NHIBnate与RIA Services和Silverlight 4.我创建了DTO以通过RIA Services传输数据而不是分发我的域层对象(根据Martin Fowler的分布式对象设计的第一定律:“不要分发你的对象!”)。 DTO对象从域图层中的五个相应图层向下展平为两层。
这是我的问题。在Silverlight 4中进行更改后,RIA Services知道哪些DTO对象已被修改,但在服务器端更新代码中,我需要将更改传回“真实”域层对象,以便NHibernate可以将这些更改应用回数据库。最好的方法是什么?
由于DTO旨在是轻量级的,只包含客户端所需的信息,我显然会不想要在DTO中嵌入相应的域对象。
以下是我考虑过的一些可能性:
1)保持对DTO对象中域对象的引用。只要 only 引用被序列化并通过线路发送,不整个引用的对象,那么这可能是一种合理的方法。当然,引用在客户端无效,因为它们指向不存在的内存位置,但在行程结束时它们可以用于服务器端。 (?)
2)与上面相同,但只保存对DTO对象中域聚合根的引用。然后使用对象关系遍历来获取其他相关的域对象。
3)将域对象的ID存储在DTO中,并使用NHibernate的“获取”ID或“加载”ID功能来检索正确的域对象,以便可以应用更新。
4)与上面相同,但只对聚合根使用“Get”或“Load”,然后对所有相关对象使用遍历。
也许以上都不是理想的,有更好的方法......
答案 0 :(得分:3)
每当我在ORM之上构建一个访问层时,我通常会继续为DTO中的实体放置任何唯一键,以便跟踪,当然也支持默认(T)一个补充。
然后,当对象回到服务器端时,我可以轻松地执行加载,从DTO中对更改后的值进行编组,然后让会话保存它或执行显式保存。
这将是你的3/4。
答案 1 :(得分:0)
要在基本级别回答您的问题 - 您可能需要查看演示模型。来自RIA服务团队的Deepesh对此有一个很好的introductory blog post。
此外,您可以使用ID而不是引用(即内在的,可序列化的值而不是app-domain-scoped对象引用)并使用[Association]。
要在下一级回答,演示模型的使用仍然涉及工作和其他类型。当您想要看到的模型的形状与服务器上的形状(无论是富域模型还是仅基于DTO的模型)大不相同时,这是最有意义的。类型数量的增加以及它们之间的映射需求是您为灵活性付出的代价。有更便宜的选择做得更少 - 例如非公共成员,序列化指令[排除]等,让您塑造代码生成和序列化模型。他们可能值得考虑。毕竟,默认情况下,信任边界两侧的类型非常不同(例如,服务器上的类型与客户端上的代码类型)。
HTH
的Dinesh