【问题标题】:How to use NHibernate and DTOs with RIA Services如何将 NHibernate 和 DTO 与 RIA 服务一起使用
【发布时间】:2010-08-16 16:28:57
【问题描述】:

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

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

由于 DTO 旨在实现轻量级,仅包含客户端所需的信息,我显然希望将相应的域对象嵌入到 DTO 中。

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

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

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

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

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

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

【问题讨论】:

    标签: silverlight nhibernate silverlight-4.0 wcf-ria-services


    【解决方案1】:

    每当我在 ORM 之上构建访问层时,我通常会继续将实体的唯一密钥放在 DTO 中,以便对其进行跟踪,当然在以下情况下支持 default(T)添加。

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

    这将是你的 3/4。

    【讨论】:

    • 不要忘记您可能还需要处理版本字段以避免并发问题。
    • 杰里米和山姆,感谢您的提示!
    【解决方案2】:

    要在基本层面回答您的问题 - 您可能需要研究演示模型。来自 RIA 服务团队的 Deepesh 对此有很好的introductory blog post

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

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

    HTH

    饭菜

    【讨论】:

    • 嗨 Dinesh,我的 DTO 旨在匹配我想在客户端看到的形状,这与富域层中的形状完全不同。所以它基本上是一个演示模型。 (我看到的一些示例显示了在客户端而不是在服务器上构建的表示模型,但这意味着您正在通过网络传输额外的信息。)Deepesh 的博客与我的情况相匹配,除了他在更新例程中使用 LINQ将更新从“DTO”传送到 DAL 对象。我的问题是如何使用 NHibernate 来实现这一点(利用 NH 的缓存和更改跟踪)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2015-12-27
    • 2017-07-15
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多