【发布时间】:2013-08-27 17:57:07
【问题描述】:
众所周知,面向对象的语言提供可重用性功能。
我有一个简单的三层应用程序:
- 表示层
- 业务层旨在获得可重用性的好处
- datalayer 是一个愚蠢的 ado.net 库(愚蠢的意思是它没有业务逻辑。)
我一直在努力在这个数据层中强制执行代码可重用性。我在数据层中的一个方法中粘贴了一个伪模式。
create connection object
open connection to database
create a transaction object
begin transaction
create command object
execute it
.
.
.
.
create nth command object
execute it
commit transaction
close connection
实际上,这段代码会膨胀到大约 300 到 400 行代码,因此无法阅读这段代码。
在这一系列命令执行中,我们在不同的表上选择/插入/更新查询。如果它不在事务中,我会将这段代码分离到它们各自的类中。
又是一个我最近遇到的意大利面图案:
business layer method1 calls datalayer method to update column1
business layer method2 calls datalayer method to update column2
businees layer method3 calls datalayer method to save the entire result in table by updating it.
当我试图获得可重用性的好处时,这种模式出现了,这些方法是从不同的位置调用的,因此它们被重用了。但是,如果要编写简单的 sql 查询而不考虑可重用性,则将只调用一次数据库。
那么,有没有什么模式或技术可以在数据层实现可重用性?
注意:
- 我不想使用任何存储过程,尽管它们 提供预编译的好处等,因为它们往往会打成平手 更具体到特定数据库的数据层。
- 我目前也只在这里不考虑任何 ORM 解决方案 普通的 ADO.net。
借口不考虑任何 ORM。
- 学习曲线
- 避免与我认为可以的特定 ORM 的紧密耦合 通过限制数据层本身的 ORM 代码来移除。
- 6 个月前我上网查了一下,只有
当时有两种流行或广泛使用的 ORM 解决方案。实体
框架和 NHibernate。我选择实体框架(
出于某些原因 稍后我会链接link1, link2 除了我感觉使用 EF 会很容易,因为它是由 Microsoft 提供的)开始学习。 - 我在本书中使用了这个Microsoft recommended book 据我所知,有三种技术 TPT, TPH 和 TPC; TPC 我从未尝试过。
- 当我检查从实体框架生成的 SQL 时,它是 非常丑陋并且正在创建一些额外的列:IDs,一些丑陋的案例 声明等,似乎对于一个高度事务性的系统 不能应用 ORM 解决方案。通过高度事务性系统,我的意思是每分钟发生 1000 次插入。数据库的大小继续膨胀,在遥远的将来会达到接近 500 到 600 GB。
【问题讨论】:
-
动态 SQL 是唯一想到的东西,但这同样混乱(如果不是更混乱的话)。您不使用 ORM 的原因是什么?
-
“我希望有人提出解决方案,但请不要提出每个人都会推荐的解决方案。我想要一个不同的解决方案。”
-
为什么不考虑 ORM 解决方案?不要重新发明轮子。不仅像 EF 和 NHibernate 这样的 ORM 框架已经解决了您遇到的问题,而且它们有很好的文档记录,并且很久以前就通过自己尝试解决了您将遇到的许多错误
-
如果您出于某种原因真的坚持自己做,请阅读泛型和工作单元模式
-
@RyanHenderson 我同意你的观点,动态 SQL 是我想到的最丑陋的东西。即使这是这个宇宙中唯一的选择,我也永远不会使用它:)
标签: c# design-patterns architecture language-agnostic ado.net