我已经阅读了有关ORM优缺点的Stack Overflow讨论,并且有不同的意见。我想描述这个特例。
我的问题是:
实现ORM(Doctrine2或Propel)是否值得,或者我应该限制自己从头开始编写模型类(类似于ActiveRecord模式,按表和记录分组方法/查询,所以每个实体都有两个相关的类?)
主要目标是:
应用程序性能,
易于编码/查询可读性和修改,以及
易于对DB(细节)进行修改。
我个人更喜欢第二种选择;有很复杂的SQL查询,我怀疑ORM能否为所有查询维护数据库抽象。最初的开发已经结束,并且不需要快速开发代码/查询代码。能够轻松阅读,理解和修改代码/查询对我们来说更为重要。
另一方面,在我错过的特定条件下,ORM可能会有一些优势。
答案 0 :(得分:1)
构建代码肯定会帮助你2和3,如果做得对,1也不应该受到影响。当您合并第三方ORM时,良好的性能应该更容易实现,因为这些ORM支持的功能,如缓存和延迟加载“开箱即用”。
我建议您尝试在一小步骤内重构您的应用程序,同时添加新功能或解决错误,从而避免难以证明和管理的大型重构项目。
我认为使用第三方ORM的一个好方法是以类似的方式组织现有的代码和查询。因此,您可能会引入ProductRepository类,该类具有封装现有查询的方法find()并返回ResultSet。接下来,您应该介绍Product Data Class(仅包含字段且没有方法的类)。产品类应映射DB中的Product表。现在找到应返回的产品数组。 find()方法现在首先将ResultSet转换为Products数组并返回数组。应相应地修改客户端代码。最后,您开始使用委托给ORM替换find()方法中的自定义查询。使用Repository的客户端不应检测到更改。 Product数据类是模型层的种子。随着您的继续,您可以添加行为并创建一个真正的域图层。
回到你的问题,我会说你首先以自定义Active Record的形式对现有代码进行分组(我建议Repository,但最后只是组织问题),然后你引入ORM。所以,这不是 - 或者情况,而是重构的第一和第二阶段。
我会通过以下方式解决这个问题:
实现完全成熟,可重复使用的ORM是很多工作,因此我建议您合并现有的ORM并开始小步骤。
我在C#专业重构书中详细描述了这种方法,您可以下载示例代码,引导您完成here。