您对数据访问层有何建议?使用ORM,如Entity Framework和Hibernate OR Code Generators,如Subsonic,.netTiers,T4等?
答案 0 :(得分:8)
对我来说,这是一个明智的选择,你生成代码。
我将稍微偏离主题,因为在游戏中存在更大的潜在谬误。谬论是这些ORM框架解决对象/关系阻抗不匹配。这种说法是一个赤裸裸的谎言。
我发现解决对象/关系阻抗不匹配的最佳方法是单独使用OOP并使用对象数据库或仅使用关系数据库的惯用语并忽略OOP。
抽象“一切都是一张桌子”对我来说,比抽象“一切都是一个阶级”强大得多。当您编写数据库而不是对象模型时,它需要更少的代码,更少的智力工作并导致更快的代码。
对我来说,这似乎是显而易见的。如果您的应用程序是数据驱动的,那么您的代码肯定也应该是数据驱动的吗?但要说这是一个极具争议性的问题。这里的核心问题是当与数据库结合使用时,OOP成为一个真正漏洞的抽象。当您看到代码在数据库中生成的流量时,在写入OOP习语时看起来非常合理的代码看起来非常疯狂。当这种混乱成为性能问题时,OOP是第一个受害者。
真的没办法解决这个问题。数据库使用集数据。 OOP专注于类的实例。试图嫁给两人总是以离婚告终。
所以为了回答你的问题,我相信你应该生成你的类并尝试让它们尽可能地映射底层数据库结构。
答案 1 :(得分:3)
也许是有争议的,我一直觉得在ADO.NET管道中使用代码生成器从根本上解决了错误的问题。
在某些时候,希望在了解Connection Strings,SqlCommands,DataAdapters以及所有这些之后不久,我们注意到:
所以,要解决的问题是“如何快速多次做同样的事情”?
我说不。
使用代码生成器快速完成此过程意味着您在业务类(或数据访问层,如果将其与业务逻辑分开)中拥有大量代码(完全相同)。
然后,如果您想要一般性地执行某些操作(例如跟踪存储过程使用情况),则最终必须自定义代码生成器(如果它还没有您想要的功能)。即使它确实如此,你仍然必须不断重建所有的东西。
无论我能做多快,我都喜欢做一次,而不是多次。
所以我推出了自己的数据访问类,它知道如何添加参数,设置和关闭连接,管理事务以及其他很酷的东西。它只需要编写一次,从一个需要完成一些数据库工作的Business对象调用它的方法包含一行代码。
当我需要使应用程序支持多线程数据库访问时,它只需要更改数据访问类,并且所有业务类只执行他们已经执行的操作。
答案 2 :(得分:1)
没有正确的答案一切都取决于你的项目。正如Simon指出您的应用程序是否都是数据驱动的,那么根据域的大小和复杂性来使用非oop范例可能是有意义的。我在使用事务脚本模式构建系统方面取得了很大成功,该模式在系统中传递XML消息。
然而,随着应用程序规模和复杂性的增加,这个系统在五六年后开始崩溃(5或6个网站,几个Web服务,大量COM +组件,遗留和.net代码,8个以上的数据库,800多个表4,000+程序)。没有人知道什么是什么,重复是猖獗的。
还有其他方法来减轻维护,然后是OOP;但是,如果你有一个非常复杂的域,那么hainvg富域模型是理想的恕我直言,因为它允许业务规则用漂亮的封装组件表示。
要回答您的问题,请尽量避免代码生成器。代码生成器是一种灾难的处方,但是如果你确实使用代码生成,则不要修改生成的代码。还要确保有一个好的流程,开发人员很容易获得新生成的代码。
我建议使用以下任一项:ORM或手动轻量级DAL。我目前正在将一个项目转移到nHibernate,我手动滚动DAL并取得了很大的成功;但是,我喜欢选择使用任一选项。此外,如果您正确地分离您的顾虑(来自演示文稿的业务层的数据访问),您可以拥有一个可以与Dao(数据访问对象)通信的服务层,对于一个对象是ORM而另一个对象是手动滚动的。我喜欢这种灵活性,因为它允许将最好的工具应用到工作中。
我喜欢nHibernate通过手动滚动DAL,因为虽然我的DAL确实抽象掉了大部分ADO.Net代码,但您仍然需要编写将数据读取器带到对象或对象并创建参数的代码。
答案 3 :(得分:0)
我总是更喜欢使用代码生成器路由,尤其是在C#中,您可以使用扩展类向基本数据对象添加功能。
答案 4 :(得分:0)
讨厌这样说,但这取决于。如果您找到符合您需求的ORM工具,请选择它。我们在开发应用程序时以小步骤编写了自己的系统。我们正在使用C ++,但无论如何都没有那么多工具。我们最终成为了数据库的XML描述,从而生成了SQL生成脚本和基本对象层以及元数据。
做好功课并评估这些工具,你会发现它们非常适合你的需要。