我目前正在组装一个相当简单的 ORM 工具,作为客户各种 Web 项目的框架。大多数项目都是内部的,不需要大量的并发性,所有项目都会与 SQL Server 相背离。我建议他们使用像 SubSonic、NHibernate 和其他一些开源项目这样的 ORM 工具,但是出于可维护性和灵活性的原因,他们希望创建一些自定义的东西。所以我的问题是:我应该确保在这个 ORM 工具中包含哪些功能?顺便说一句,我将使用 MyGeneration 来生成代码模板。
10 回答
为了所有神圣的人(以及妇女和儿童)的爱,尽一切可能说服他们不要使用定制的 O/RM 解决方案。当已经存在完美的开源轮子时,为什么人们想要重新发明轮子?!?!
如果您的客户因为(真实的或想象的)对支持的看法而对 OSS 不感兴趣,您是否考虑过任何顶级的商业第三方 ORM,例如LightSpeed,它带有一个不错的 GUI 设计器工具
(来源:mindscape.co.nz)
Mindscape(销售 LightSpeed 的公司)是一家位于我居住地附近的新西兰公司,我在那里遇到了一些开发人员,我知道他们以拥有令人难以置信的客户支持而闻名。当您购买软件时,它们会为您提供源代码,因此您可以随意调整它。
你可能不想推出自己的 ORM,除非你必须这样做并且你的客户愿意交出一大笔现金让你这样做。
IMO 编写自己的 OR/M 是您可能做出的最糟糕的设计决策之一。“可维护性和灵活性”正是不编写自己的 OR/M 的原因。
请阅读查看不编写自己的对象关系映射器的 25 个理由,看看您的客户是否真的愿意支付构建NHibernate(760 万美元)或SubSonic(150 万美元)之类的东西的成本。因为,就像上面 ChanChan 所说的,你最终会得到类似的东西。
Davy Brion(NHibernate 提交者)有很多帖子,由于某种原因,他还被迫为客户编写自定义 ORM。
他涵盖的一些内容是:
- 将类映射到表
- 开箱即用的 CRUD 功能
- 保湿实体
- 会话级缓存
- 执行自定义查询
如果您必须走这条路,绝对值得一试:构建您自己的数据访问层系列
根据我的经验,您需要采用 nHibernate 样式并拥有它,以便您在对象和数据库之间拥有某种映射。这允许您的对象具有一些难以在数据库中表示但在 POCO 中更容易表示的东西。
Generation 通过为您提供符合您的模式的类来帮助您开始,但是如果您打算维护任何东西或测试任何东西,那么映射现在是痛苦的,以后会很高兴。
Subsonic 是一个很棒的模型,它的开源,如果你必须去生成,使用他们在 myGeneration 中的模板来获得优势。
顺便说一句:我已经完成了你正在做的事情,我最终得到了与亚音速非常相似的东西,现在建议我的客户使用亚音速源,并为他们自己分叉。
也许只是也许,您急需一些现有解决方案中尚不存在的“功能”。也许您还需要更简单的东西。亚音速的 1.5 美元简直太离谱了。也许你想使用 POCO。也许您想在 3 层场景中轻松使用这些东西。也许您不想支持地球上的所有 RDBMS,因此您可以为您的目标硬编码和优化代码。也许您想实现更智能的对象跟踪。可能现有 orms 做出的一些设计决策会让你发疯......
我自己正在使用我自己和我自己开发的自定义 orm,我很满意我做到了。地毯下没有隐藏的龙,没有惊喜的场景。我的 orm 完全符合我的要求,仅此而已。
二级缓存
允许您在内存中维护实体实例
自动脏检查
允许您在不加载对象的情况下更新对象的更改。
强大的查询语言
强大的级联操作
强大的主键生成器策略
ORM 框架将根据目标数据库选择最佳的主键生成器策略
支持复合元素
对活动的支持
onSave、onUpdate 等
良好的文档和参考书
支持会话状态
问候,
您作为顾问的工作(听起来就是这样)是利用您的专业知识为您的客户实施符合他们需求的解决方案,同时以最少的成本和时间投资。
如果他们想建造和销售 OR/M。去城里做一个。如果他们想要其他任何东西,请使用已经存在的来完成工作。
如果他们坚持花钱,就买一个现有的(我不会点名,但有一些不错的不是免费的)。
尝试使用Devart LinqConnect - 所有 LINQ to SQL 功能和对最流行的数据库服务器的广泛支持 - Oracle、MySQL、Postgre、SQL Server 和 SQLite。令人难以置信的可视化建模工具、先进的监控工具、高质量的支持——因此,我在项目执行期间仅用了三周就学会了它。
还没有人提到它;但是选择LLBLGen。您可以根据需要自定义模板,当然,您也可以在生成的类中编写自己的自定义代码。买它。你永远不会回头,你会说“谢谢你丝滑!” 当它始终如一地工作时。(我没有写,但我喜欢它)。如果它不适合你,你也可以说“该死的丝滑!”。但这不太可能,但我确实提供了它作为一种选择。
我注意到关于 LLBLGen 的唯一不好的事情是支持动态切换数据库/服务器。它不支持我想要的功能;即检测您检索到的给定实体在您切换到的新数据库中“不存在”的能力。但这是一种罕见的情况。
我建议使用 LLBLGen,因为当我遇到它时,我正在编写自己的 OR/M。再也没有回头。