Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 如何在RIA服务中使用NHibernate和DTO_Silverlight_Nhibernate_Silverlight 4.0_Wcf Ria Services - Fatal编程技术网

Silverlight 如何在RIA服务中使用NHibernate和DTO

Silverlight 如何在RIA服务中使用NHibernate和DTO,silverlight,nhibernate,silverlight-4.0,wcf-ria-services,Silverlight,Nhibernate,Silverlight 4.0,Wcf Ria Services,我正在使用NHibernate与RIA服务和Silverlight 4。我创建DTO用于通过RIA服务传输数据,而不是分发我的域层对象(根据Martin Fowler的分布式对象设计第一定律:“不要分发对象!”)。DTO对象从域层中的五个对应层展平到两个层 这是我的问题。在Silverlight 4中进行更改后,RIA Services知道修改了哪些DTO对象,但在服务器端更新代码中,我需要将更改传输回“真实”域层对象,以便NHibernate可以将这些更改应用回数据库。最好的方法是什么 由于D

我正在使用NHibernate与RIA服务和Silverlight 4。我创建DTO用于通过RIA服务传输数据,而不是分发我的域层对象(根据Martin Fowler的分布式对象设计第一定律:“不要分发对象!”)。DTO对象从域层中的五个对应层展平到两个层

这是我的问题。在Silverlight 4中进行更改后,RIA Services知道修改了哪些DTO对象,但在服务器端更新代码中,我需要将更改传输回“真实”域层对象,以便NHibernate可以将这些更改应用回数据库。最好的方法是什么

由于DTO是轻量级的,只包含客户端所需的信息,我显然不想在DTO中嵌入相应的域对象

以下是我考虑过的几种可能性:

1) 保留对DTO对象中的域对象的引用。只要引用被序列化并跨线路发送,而不是整个引用对象,那么这可能是一种合理的方法。当然,这些引用在客户端是无效的,因为它们会指向不存在的内存位置,但在旅程结束时,它们可以被服务器端使用。(?)

2) 同上,但仅在DTO对象中保存对域聚合根的引用。然后使用对象关系遍历来访问其他相关的域对象

3) 将域对象的ID存储在DTO中,并使用NHibernate的“按ID获取”或“按ID加载”功能检索正确的域对象,以便应用更新

4) 与上面相同,但仅对聚合根使用“Get”或“Load”,然后对所有相关对象使用遍历


也许以上这些都不理想,还有更好的方法……

每当我在ORM上构建一个访问层时,我通常会在DTO中放入实体的唯一键,以便跟踪,当然,在add的情况下支持默认值(T)

然后,当对象返回到服务器端时,我可以轻松地进行加载,将更改后的值从DTO整理过来,然后让会话保存它或执行显式保存


这将是您的3/4。

回答您的基本问题-您可能需要研究演示模型。RIA服务团队的Deepesh对此有很好的理解

此外,您可以使用ID而不是引用(即内在的、可序列化的值而不是应用程序域范围的对象引用)并使用[Association]

为了在下一个层次上回答这个问题,表示模型的使用仍然涉及工作和其他类型。当您希望看到的模型的形状与服务器上的形状(无论是富域模型还是仅基于DTO的模型)有很大不同时,这一点最有意义。类型数量的增加以及在它们之间映射的需要是您为灵活性付出的成本。有一些更便宜的选项可以做得更少,例如非公共成员、序列化指令[Exclude]等,它们可以让您形成代码生成和序列化模型。它们可能值得考虑。毕竟,信任边界两侧的类型在默认情况下是非常不同的(例如,服务器上的类型与客户端上的代码生成类型)


Dinesh

不要忘记,您可能还需要处理版本字段,以避免并发问题。Jeremy和Sam,谢谢您的提示!您好,Dinesh,我的DTO设计为与我希望在客户端上看到的形状相匹配,这与rich domain层中的形状大不相同。因此,它基本上是一个表示模型。(我看到的一些示例显示,演示模型是在客户机上而不是在服务器上构建的,但这意味着您正在通过网络传输额外的信息。)Deepesh的博客与我的情况相匹配,只是他在更新例程中使用LINQ将更新从“DTO”传送到DAL对象。我的问题是如何使用NHibernate(利用NH的缓存和更改跟踪)实现这一点。