0
点赞
收藏
分享

微信扫一扫

How to Select an Object-Relational Mapping Tool for .NET

在选择对象关系映射工具时,要注意的一个最重要的陷阱是:“按产品划分的架构”。

按产品划分的架构是我用来描述多年来在项目中看到的一系列症状的术语。在这些项目中,整个团队将花费数月时间在产品比较表上苦苦挣扎,讨论各种功能的重要性和排名,所有这些都没有一个连贯的架构。一旦选择了产品,决定就一成不变,建筑(当有一个时)围绕产品弯曲。毋庸置疑,这些项目成为“永无止境的成功”。

在选择对象关系映射工具时,您需要了解为什么需要对象关系映射以及它适合您的体系结构的位置。

如今,您在信息系统中看到三种常见的体系结构类型:

  1. 客户端-服务器
  2. 网络应用程序
  3. 智能客户端(又名 N 层)

我使用这些术语有点松散,所以我将定义我所说的它们的含义,以及如何在每个术语中使用对象关系映射。

客户端-服务器体系结构类型(也称为富客户端)涉及在与数据库服务器通信的客户端计算机上运行的软件。此描述不排除数据库中的存储过程;事实上,在客户端 - 服务器流行的时候,许多指导都指向了这个方向。对象关系映射正好适合体系结构类型,特别是对于开发良好的域模型。它至少可以为您节省相当多的SQL编码,并在充分利用时可以优雅地处理复杂的并发行为。

​​


点击此处查看大图。

图 1

图 1 说明了对象关系映射在此体系结构类型中的最基本用法。用户界面元素(如控件和窗体)利用表示域模型的业务对象来编写逻辑,同时使用 o-r 映射库中的对象来保留对数据库的更改。

此体系结构类型产生的最佳做法是在 UI 和对象关系映射库之间创建中介。在领域驱动设计术语中,这个中介被称为存储库,但它的目的很简单:封装所有对象关系映射代码并保持用户界面独立于它。图 2 说明了这些新关系。

​​


点击此处查看大图。

图2

在客户端-服务器应用程序中使用存储过程的建议方法可能会影响您对对象关系映射工具的选择。如果要在数据库中使用存储过程,请注意,许多工具不支持针对它们进行映射。

Web 应用程序的出现是作为客户端-服务器应用程序繁重部署足迹的替代方案而出现的。需要注意的有趣一点是,部署 Web 应用程序的服务器与其前身不同。有趣的是,这种体系结构类型与客户端-服务器仅在显示用户界面的位置离开有很多共同之处。

​​


点击此处查看大图。

图 3

我们在这种体系结构类型中所做的是将各种客户端计算机上所有正在运行的实例物理替换为服务器计算机上的单个实例。如果我们将存储库和业务对象开发为“无状态”(在需要时从数据库中检索所有状态),那么它们可以很容易地在客户端-服务器和 Web 之间来回移植。

智能客户端是应用程序开发的最新热潮,只有SOA在炒作中才能与之匹敌。真正的 N 层开发(如智能客户端)与以前的体系结构类型之间的区别在于,过去在单台计算机上运行的代码现在必须在不同的计算机上以不同的部分运行。在最基本的层面上,智能客户端需要获取用户界面元素和一些业务逻辑,并在客户端计算机上运行它们。即使在这个级别,也不清楚的是服务器上还剩下什么运行。图 4 显示了采用以前的范例并在新约束下天真地应用它的结果。

​​


点击此处查看大图。

图 4

这种架构在哪些方面有所欠缺?好吧,它没有考虑到分配问题。存储库和对象关系映射库之间的接口,以及业务对象最初是为进程内通信而设计的,即“chatty”接口。在机器之间公开这种接口的结果是性能急剧下降。正是这种体系结构导致了产品比较图表中“支持远程数据访问层方案”之类的功能。图 5 显示了为 N 层分布式部署设计的体系结构。

​​


点击此处查看大图。

图 5

若要维护丰富、高性能的 UI 体验,存储库和业务对象都需要在本地可用。一个常见的误解是,客户端上的业务对象和服务器上的业务对象是相同的。每种方法都有不同的用途。为客户端开发的业务对象的存在是为了支持 UI 功能。这包括提供高质量的数据绑定功能以及丰富的验证。为服务器开发的业务对象的存在是为了封装业务规则并在事务(在服务层管理的事务)中进行协作。

有一个主题尚未被讨论,那就是对象关系映射的致命弱点——报告。

我还没有看到一个不需要某种报告的应用程序。报告不一定以以 Word 或 PDF 格式打印的报告开头和结尾。报告的基础是将不同类型的数据联接到单个视图中,此视图主要是只读的。出于某种原因,一旦开发人员开始使用对象关系映射工具,他就会突然想将其用于所有事情 - 包括报告。

报告中使用的数据与对象没有任何联系。首先,它只是数据,而不是一点点行为。其次,您不需要涉及的所有实体的所有数据 - 只需要来自每个实体的少量数据。.NET 中的数据表非常适合这些需求。因此,尽管许多对象关系映射工具可能使您能够执行复杂的查询并取回对象,但在报告的情况下,您不需要它。这绝对是从产品比较表中删除的一个功能。

我希望这次讨论能够阐明对象关系映射在更大的事物方案中的位置,以及没有它应该开发哪些功能。如果您有任何意见或问题,请随时通过 Udi@UdiDahan.com 与我联系。

关于作者

乌迪·达汉是微软架构师 MVP、公认的 .NET 专家和 C 经理4科伦泰克的ISR系统开发小组。Udi被称为以色列面向服务架构的主要权威,并就大规模关键任务系统的架构和设计提供咨询,这些系统开发了所有

http://www.developer.com/design/article.php/10925_3531871_1



举报

相关推荐

0 条评论