代码生成器还是ORMs?

代码生成器还是ORMs?,orm,code-generation,data-access-layer,Orm,Code Generation,Data Access Layer,您对数据访问层有什么建议?使用实体框架和Hibernate等ORM或亚音速、.netTiers、T4等代码生成器?我一直倾向于使用代码生成器,尤其是在C#中,在C#中,您可以使用扩展类向基本数据对象添加功能。我不想这么说,但这取决于具体情况。如果你找到了一个适合你需要的ORM工具,那就去吧。在开发应用程序时,我们以很小的步骤编写了自己的系统。我们使用C++,而且没有太多的工具。我们最终得到了数据库的XML描述,从中生成了SQL生成脚本、基本对象层和元数据 做好准备并评估这些工具,你会发现它们很适

您对数据访问层有什么建议?使用实体框架和Hibernate等ORM或亚音速、.netTiers、T4等代码生成器?

我一直倾向于使用代码生成器,尤其是在C#中,在C#中,您可以使用扩展类向基本数据对象添加功能。

我不想这么说,但这取决于具体情况。如果你找到了一个适合你需要的ORM工具,那就去吧。在开发应用程序时,我们以很小的步骤编写了自己的系统。我们使用C++,而且没有太多的工具。我们最终得到了数据库的XML描述,从中生成了SQL生成脚本、基本对象层和元数据


做好准备并评估这些工具,你会发现它们很适合你的需要。

也许有争议,我一直认为在ADO.NET管道中使用代码生成器从根本上解决了错误的问题

在了解了连接字符串、SqlCommands、DataAdapter等之后不久,我们注意到:

  • 这样的代码很难看
  • 写作很无聊
  • 如果你用手做的话,很容易错过一些东西
  • 每次要访问数据库时都必须重复此操作
  • 所以,要解决的问题是“如何快速多次做相同的事情”

    我说不

    使用代码生成器使这一过程变得快速仍然意味着您的业务类(或者数据访问层,如果您将其与业务逻辑分离的话)上都有大量的代码

    然后,如果你想做一些一般性的事情(比如跟踪存储过程的使用情况),如果你的代码生成器还没有你想要的功能,你就必须定制它。即使这样,你仍然需要不断地再生一切

    我喜欢做一次,而不是很多次,不管我做得有多快

    所以我推出了自己的数据访问类,它知道如何添加参数、设置和关闭连接、管理事务以及其他很酷的东西。它只需要编写一次,从需要完成一些数据库工作的业务对象调用它的方法只需要一行代码


    当我需要使应用程序支持多线程数据库访问时,它只需要更改数据访问类,所有业务类都只做它们已经做过的事情。

    对我来说,这是一个简单的问题,您可以生成代码

    我要稍微偏离主题,因为有一个更大的潜在谬论在起作用。谬误在于这些ORM框架解决了对象/关系阻抗不匹配问题。这种说法是赤裸裸的谎言

    我发现解决对象/关系阻抗不匹配的最佳方法是,要么专门使用OOP并使用对象数据库,要么专门使用关系数据库的习惯用法并忽略OOP

    对我来说,“一切都是一个表”的抽象比“一切都是一个类”的抽象强大得多。当你编码到数据库而不是对象模型时,它需要更少的代码,更少的脑力劳动,并导致更快的代码

    对我来说,这似乎是显而易见的。如果您的应用程序是数据驱动的,那么您的代码也应该是数据驱动的吗?然而,要说这一点是极具争议的

    这里的中心问题是,当OOP与数据库结合使用时,它会成为一个真正的泄漏抽象。当您看到代码在数据库中生成的通信量时,使用OOP习惯用法编写的代码看起来非常合理,这看起来完全疯狂。当这种混乱成为性能问题时,OOP是第一个受害者

    真的没有办法解决这个问题。数据库处理数据集。OOP关注类的实例。试图与这两个人结婚总是以离婚告终


    因此,为了回答您的问题,我认为您应该生成类,并尝试使它们尽可能接近底层数据库结构。

    没有正确的答案,这完全取决于您的项目。Simon指出,如果您的应用程序都是数据驱动的,那么根据域的大小和复杂性,使用非oop范式可能是有意义的。我使用事务脚本模式成功地构建了一个系统,该模式在系统中传递XML消息

    然而,随着应用程序规模和复杂性的增长(5或6个web、多个web服务、大量COM+组件、遗留代码和.net代码、8+数据库和800+表4000+过程),该系统在5或6年后开始崩溃。没有人知道这是什么,复制正在猖獗

    还有其他方法来减轻维护,然后OOP;但是,如果您有一个非常复杂的域,那么hainvg一个丰富的域模型是理想的IMHO,因为它允许业务规则在漂亮的封装组件中表达

    要回答您的问题,请尽可能避免使用代码生成器。代码生成器会导致灾难,但如果您执行代码生成,请不要修改生成的代码。还要确保有一个好的流程,开发人员可以很容易地获得新生成的代码

    我建议使用以下两种方法之一:ORM或手摇轻型DAL。我目前正在将一个项目移交给nHibernate,并且取得了很大的成功;然而,我喜欢选择使用任何一个选项。此外,如果您正确地将您的关注点(数据访问、业务层和表示)分离开来,您可以有一个单独的服务层,该服务层可以与Dao(数据访问对象)进行通信,其中一个对象是ORM,而另一个对象是手工操作的)。我喜欢这种灵活性,因为它允许在工作中应用最好的工具

    我喜欢nHibernate而不是手动DAL,因为虽然我的DAL抽象掉了大部分ADO.Net代码,但您仍然需要编写co