【发布时间】:2011-05-14 11:48:58
【问题描述】:
我不会详细说明我在这个阶段探索使用 Micro ORM 的原因 - 只是说当我使用完整的 ORM 时我感到无能为力。有太多的事情在后台自动发生,并不是所有的事情都是最好的选择。我已经准备好回到原始数据库访问,但我发现了三个新人:Dapper、PetaPoco 和 Massive。所以我决定在一个宠物项目中尝试一下低层次的方法。这无关紧要,但到目前为止,我正在使用 PetaPoco。
无论如何,我都无法决定如何维护我将从更高级别使用的 SQL 字符串。我能想到的主要解决方案有以下三种:
将 SQL 查询分散在我需要的任何地方。这是最不重基础设施的方法。但是,它在可维护性和可测试性方面都受到影响。
将查询使用限制为某些服务类。这有助于可维护性,我需要实现的基础设施仍然很低。也可以构建这些服务类,以便为测试目的轻松模拟。
准备一些类以使系统具有一定的灵活性。我已经开始走这条路了。我实现了一个 Repository 接口和一个依赖于数据库的 Repository 类。我还构建了一些小接口来捕获可以传递给我的存储库的 GetMany() 方法的 SQL 查询。现在所有的查询都作为单独的类实现,我可能需要更多的接口来增加数据库的独立性——也许在将查询装饰成分页和排序查询时有一些灵活性(同样,这也会使它们在处理不同的数据库时更加灵活)。
我现在主要担心的是,我已经进入了编写完整 ORM 所需的所有函数的滑坡,但是很糟糕。例如,我现在感觉很明智,我编写或找到一个库来将 linq 调用转换为 SQL 语句,这样我就可以轻松地处理我的查询,或者编写可以装饰我传递给它的任何查询的扩展程序,等等。但这是一个很大的问题任务,而且已经被大佬们完成了,所以我忍住了要去那里的冲动。我还想保留对我发送到数据库的查询的控制 - 通过显式编写它们。
那么建议是什么?我应该选择#2选项,还是尝试偶然发现选项#3?我敢肯定,我不能不脸红地向任何人展示第一个选项中编写的任何代码。您还有其他方法可以推荐吗?
编辑:在我提出这个问题后,我意识到还有另一个选项,与这三个选项有些正交:存储过程。将所有查询作为存储过程放入数据库中似乎有一些优点。它们被保存在一个中心位置,而不是通过代码传播(尽管维护是一个问题 - 参数可能会不同步)。对数据库方言的依赖是自动解决的:如果你移动数据库,你移植所有的存储过程,你就完成了。还有安全方面的好处。
使用存储过程选项,备选方案 1 和 2 似乎更合适一些。似乎没有足够的实体来保证选项 3 - 但仍然可以将过程调用命令与数据库访问代码分开。
我已经实现了不带存储过程的选项 3,以及带有存储过程的选项 2,似乎后者更适合我(以防有人对问题的结果感兴趣)。
【问题讨论】:
-
在深入研究细节之前...您检查过 ibatis.net 吗?
-
这里没有适合所有尺寸的答案,这实际上取决于您拥有的项目类型....您也可以选择混合搭配
-
@p.marino 我做到了,我也被它诱惑了。我更喜欢我提到的三个接口。不过,我最终可能会将我的宠物项目移植到那里,看看感觉如何。
-
@Sam 我同意你的看法。如果您愿意,可以将其视为一次钓鱼探险。我对 DB 应用程序领域有些陌生,如果有我还没有看到的选项,我会很高兴有机会检查它们。
-
不确定这是否有帮助,但我们使用抽象工厂模式管理我们的 sql 连接(对我们的需求非常灵活,希望它也能让其他人受益?):stackoverflow.com/questions/2969841/…跨度>