.NET世界中的ORM和SOA

时间:2009-01-05 09:33:36

标签: .net linq nhibernate orm soa

根据我的经验,.NET的主要ORM框架(NHibernateLinqToSqlEntity Framework)在跟踪加载的对象时效果最佳。这适用于简单的客户端 - 服务器应用程序,但在面向服务的体系结构中使用三层或更多层架构与Web服务时,这是不可能的。最终,通过编写大量代码来自己进行跟踪,可以完成,但是ORM不应该简化数据库访问吗?

在面向服务的体系结构中使用ORM的想法是否很好?

7 个答案:

答案 0 :(得分:7)

LLBLGen Pro在实体内部进行了更改跟踪。这意味着您可以使用预取路径从数据库中获取图形(每个图形节点一个查询)并通过网络将其序列化到客户端,在那里进行更改,将其发回并直接保存图形,因为所有更改跟踪都在内部实体(并在XML中作为紧凑的自定义元素序列化)。

免责声明:我是llblgen pro的首席开发人员。

答案 1 :(得分:4)

这取决于你对'SOA'的意思。在服务合同中公开域对象很少是良好的服务设计 - 它暴露了内部实现细节,更改发布合同的可能性更大,版本化变得非常困难。

如果为服务端点创建自定义消息文档(例如WCF DataContracts),则使用ORM来实现服务相对容易。通常,您将从数据库重新加载域对象并映射已更改的属性(或调用方法),然后保留更改。

如果您的服务主要是CRUD方法,那么您的自定义消息将有效地成为DTO。您需要手动管理乐观并发和域对象映射。

更新:这是一个陈旧的答案,所以我想指出EF4现在也是includes change tracking in entities。我仍然认为这是糟糕的服务合同设计,但如果您只是在分布式应用程序框架之后,它可能是一个不错的选择。

答案 2 :(得分:3)

查看DataObjects.Net中的upcoming synchronization and disconnected sets的描述

答案 3 :(得分:2)

我会谦卑地建议您停止尝试将分布式对象用作架构模式。它不如消息体系结构或RESTful样式有效。

如果您不喜欢将数据传入和传出消息的开销,那么我建议您查看REST。 但是,不是ADO.NET数据服务的方式,而是通过HTTP的分布式对象。

REST更多的是在服务器上暴露丑陋(但机器可读)的UI并使用客户端使其看起来漂亮。在REST中,客户端不了解域实体,因此您无需通过线路发送它们。

答案 4 :(得分:1)

只有直接与数据库通信时,ORM框架才能帮助您。即使在面向服务的体系结构中,ORM也只能帮助减少编程最后一层时的负载。您需要其他技术(如WCF)来处理服务部分。我还没有意识到有任何人正在集成ORM和服务,但它应该非常直接地注释与实体和DataContract相同的类。

答案 5 :(得分:0)

SignumFramework也在实体内部进行跟踪。它还有一个完整的Linq提供程序,但仅适用于新数据库(它从c#实体生成模式,而不是oposite)。

更改跟踪:http://www.signumframework.com/ChangeTracking.ashx

免责声明:我是Signum Framework的首席开发人员:)

答案 6 :(得分:0)

您可以使用memcached作为NHibernate的二级缓存 - 这就是“保持跟踪”的意思吗?