1

我正在用C#开发客户端-服务器桌面应用程序系统。客户端只是一个瘦客户端,它显示服务器告诉它的任何内容。服务器直接与本地数据库通信,该数据库用于存储各种系统的元数据。每个系统都有自己的表,其结构对于该系统是唯一的。

我试图了解如何在没有“硬编码”任何内容的情况下告诉桌面应用程序数据库的结构,如果这有意义的话。我相信我需要研究对象关系映射,但我不太确定从哪里开始,因为我以前从未参与过这种复杂的项目。我的想法是我的服务器配置以某种方式定义了这个映射,并且它可能是可扩展的,因此我可以在将来为更多系统添加更多映射,或者可能更改映射。

我如何看待这个系统的工作是这样的:

客户端上的用户将包含元数据的文件上传到服务器。服务器将确定该文件适用于哪种系统类型,然后解析该文件以提取元数据,并将其输入数据库。我最初设想这种情况发生的方式是,我将拥有一个需要为每种系统类型派生的通用抽象类/接口。然后派生类将实现特定于该系统类型的解析函数,以便它可以从文件中提取元数据。但这里的问题是我无法将提取的数据输入数据库,因为服务器不知道派生类的底层结构。

谁能指出我正确的方向?我找到了NHibernate,这听起来像是我可能需要的,但我不是 100% 确定。部分问题是,正如我之前所说,我对其中一些概念没有完全理解。谁能推荐一些在线资源,可以帮助我理解对象关系映射器(ORM),特别是它与.Net Framework的关系?

4

2 回答 2

5

这里的最终问题不是要使用哪个对象关系映射器(ORM),而是这样的映射器最终会做什么。这个特定的层经常交织到数据访问层 (DAL)中。

您会看到这里的函数本质上是一种在不兼容类型之间进行转换的技术。本质上,它创建了一个可以使用的虚拟对象数据库。该层的重要性是将您的域逻辑/业务层链接到您的数据访问层或对象关系映射器。这本质上有助于解耦不需要访问数据结构的逻辑——这使得用户界面、域逻辑和数据访问层之间的解耦更加连贯。

接口不知道您的数据如何与您的数据结构对话。目前,由于相似之处,我一直在混合数据访问层对象关系映射器,但它们完全不同。

数据访问层与对象关系映射器有何不同

与面向对象语言关系数据库之间的传统交换技术相比,对象关系映射器通常会减少需要编写的代码量。这种好处是显而易见的——但也包含一个巨大的陷阱。他们倾向于过度抽象正在发生的事情,这掩盖了实际发生的事情。

要考虑的另一件事是,如果您过度依赖ORM,它可能会产生设计不佳的数据库。

对象关系映射理论

从图中可以看出,这就是Object Relational Mapper背后的理论。在N 层体系结构面向服务的体系结构中经常发现的数据访问层

数据访问层

两者的主要区别在于:

对象关系映射工具以这种方式提供数据层,遵循活动记录模型。ORM/活动记录模型在 Web 框架中很流行。

数据访问层是简化对存储在某种持久存储中的数据的访问的层。使用数据访问层的应用程序可以依赖于数据库服务器,也可以独立于数据库服务器。如果数据访问层支持多种数据库类型,应用程序就可以使用 DAL 可以与之通信的任何数据库。在任何一种情况下,拥有一个数据访问层都为对数据库的所有调用提供了一个集中位置,因此可以更轻松地将应用程序移植到其他数据库系统(假设 100% 的数据库交互在 DAL 中完成)应用)。

正如您现在可以看到的相似之处和不同之处,但是数据结构呢?我是否被迫在数据库中?简短的回答是否定的。您有以下一些选择:

  • 关系数据:您将使用更传统的数据库方法。
  • NoSQL:对象关系映射器* 遵循NoSQL方法出现。

这将根据您的项目要求提供更大的灵活性。Stack Overflow上的一个很好的问题实际上有一个使用NoSQL方法的现实世界。(这里)

四个非常明显的好处是:

  • 生产力:数据访问代码通常是典型应用程序的重要部分,编写该代码所需的时间可能是整个开发计划的重要部分。使用 ORM 工具时,代码量不太可能减少——事实上,它甚至可能会增加——但 ORM 工具会根据您定义的数据模型,在瞬间自动生成 100% 的数据访问代码。

  • 应用程序设计:由经验丰富的软件架构师设计的优秀 ORM 工具将实现有效的设计模式,几乎迫使您在应用程序中使用良好的编程实践。这有助于支持关注点的清晰分离和允许并行、同时开发应用程序层的独立开发。

  • 代码重用:如果您创建一个类库来为 ORM 生成的数据访问代码生成单独的 DLL,您可以轻松地在各种应用程序中重用数据对象。这样,每个使用类库的应用程序根本不需要数据访问代码。

  • 应用程序可维护性: ORM 生成的所有代码都可能经过良好测试,因此您通常无需担心对其进行广泛测试。显然,您需要确保代码能够满足您的需求,但广泛使用的 ORM 可能会让许多不同技能水平的开发人员对代码进行攻击。从长远来看,您可以重构数据库架构或模型定义,而不会影响应用程序使用数据对象的方式。

显然,拿一粒盐来说,因为一个应用程序经过测试并不意味着它不能被进一步测试或变得更好。

您可以找到大量对象关系映射器:

这些只是可用的大量数量中的一小部分,带有列表的链接。有些很棒,有些则不然。 最终目标将是找到哪个与您期望的应用目标密切相关-

希望这真的可以帮助你。

于 2013-07-02T21:48:29.013 回答
3

查看 OrmLite https://github.com/ServiceStack/ServiceStack.OrmLite

语法非常好,实际上服务堆栈中的很多东西都很好。

他们还在这里列出了一堆替代品 http://www.servicestack.net/benchmarks/

于 2013-07-02T20:32:57.790 回答