我目前正在开发一个相当简单的ORM工具,作为客户各种Web项目的框架。其中大部分项目是内部项目,并不需要大量并发,并且所有项目都将使用SQL Server。我建议他们选择SubSonic、NHibernate和其他一些开源项目等ORM工具,但出于可维护性和灵活性的考虑,他们想要创建一些自定义内容。所以我的问题是:我应该确保在这个ORM工具中包含哪些功能呢?顺便说一句,我将使用MyGeneration来生成代码模板。
我目前正在开发一个相当简单的ORM工具,作为客户各种Web项目的框架。其中大部分项目是内部项目,并不需要大量并发,并且所有项目都将使用SQL Server。我建议他们选择SubSonic、NHibernate和其他一些开源项目等ORM工具,但出于可维护性和灵活性的考虑,他们想要创建一些自定义内容。所以我的问题是:我应该确保在这个ORM工具中包含哪些功能呢?顺便说一句,我将使用MyGeneration来生成代码模板。
为了上帝的爱(和妇女、孩子们的安全),请尽一切可能说服他们不要选择自定义的对象关系映射(O/RM)解决方案。为什么人们想要重新发明轮子,当已经存在完美好用的开源轮子?!?
除非必须这样做且您的客户愿意支付巨额费用,否则您可能不想自己开发ORM。
在IT技术领域,自己编写ORM(对象关系映射)是最糟糕的设计决策之一。正是因为“可维护性和灵活性”,才不应该编写自己的ORM。
请阅读《25 Reasons Not To Write Your Own Object Relational Mapper》,看看您的客户是否真的想支付像NHibernate(760万美元)或SubSonic(150万美元)这样的成本。因为,就像上面的ChanChan所说,你最终会得到类似的结果。
有一些由Davy Brion(NHibernate的提交者)发布的帖子,他不知为何也被迫为客户编写自定义ORM。
他涵盖的一些内容包括:
如果您必须走这条路,那么绝对值得一看:创建自己的数据访问层系列
二级缓存
允许您在内存中维护实体实例。
自动脏检查
允许您更新对象中的更改而不加载它。
强大的查询语言
强大的级联操作
强大的主键生成策略
ORM框架将根据目标数据库选择最佳的主键生成策略
支持复合元素
支持事件
onSave、onUpdate等
良好的文档和参考书籍
支持会话状态
此致敬礼
根据我的经验,你需要采用nHibernate风格,并建立对象和数据库之间的映射关系。这样可以让你的对象拥有一些在数据库中难以表示但在POCOs中更容易表示的东西。
生成代码可以帮助你入门,提供符合模式的类,但如果你计划维护或测试任何东西,映射就是现在的痛苦,未来的快乐。
Subsonic是一个很好的模型,而且它是开源的,如果你必须使用生成代码,请使用myGeneration中的它们的模板来获得优势。
顺便说一句:我已经做过你正在做的事情,最终得到了与subsonic非常相似的东西,现在我建议我的客户获取subsonic源代码,并为自己创建分支。
还没有人提到它,但是选择LLBLGen。您可以根据自己的喜好自定义模板,并且显然可以在生成的类中编写自己的自定义代码。购买它。当它始终完美地工作时,您永远不会回头,并且会说“谢谢你,丝滑!”(我没有写它,但我喜欢它)。如果它对您不起作用,您也可以说“该死的,丝滑!”但这不太可能发生,尽管我提供这个选项。
我注意到关于LLBLGen唯一的坏事是支持动态切换数据库/服务器的功能。它不支持我想要的一个功能,即能够检测您检索的给定实体在您切换到的新数据库中是否“存在”。但这是一个罕见的情况。
我建议使用LLBLGen,因为当我遇到它时,我正在编写自己的OR/M。从此我就再也没有回头过。
作为一名顾问(听起来你就是这样的),你的工作是利用你在实施方面的专业知识,以最小的成本和时间投资为客户提供一个符合他们需求的解决方案。
如果他们想要构建并销售一个OR/M,那就去制作一个。如果他们想要其他任何东西,使用已经存在的工具来完成任务。
如果他们坚持要花钱,那就购买一个现有的(我不会透露任何名称,但有一些不免费的好工具可供选择)。