0

每个人都知道面向对象的语言提供了可重用特性。

我有一个简单的三层应用程序:

  1. 表示层
  2. 业务层旨在获得可重用性的好处
  3. 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 查询而不考虑可重用性,则会对数据库进行一次调用。

那么,是否有任何模式或技术可以在数据层实现可重用性?

笔记:

  1. 我不想使用任何存储过程,尽管它们提供预编译好处等,因为它们倾向于将数据层更具体地绑定到特定数据库。
  2. 我目前也没有考虑任何 ORM 解决方案,只有普通的 ADO.net。


借口不考虑任何 ORM。

  1. 学习曲线
  2. 避免与特定 ORM 的紧密耦合,我认为可以通过限制数据层本身的 ORM 代码来删除它。
  3. 我在 6 个月前的某个时间查看了互联网,当时只有两种流行或广泛使用的 ORM 解决方案可用。实体框架和 NHibernate。我选择实体框架(出于某些原因,我稍后会链接 link1link2,此外我觉得使用 EF 会很容易,因为它是由 Microsoft 提供的)开始学习。
  4. 我在这本书中使用了这本微软推荐的书,据我了解TPTTPHTPC有三种技术 ;TPC 我从未尝试过。
  5. 当我检查从 Entity Framework 生成的 SQL 时,它非常丑陋并且正在创建一些额外的列:ID、一些丑陋的 Case 语句等,对于高度事务性的系统似乎无法应用 ORM 解决方案。通过高度事务性系统我的意思是每分钟发生 1000 次插入。数据库的大小继续膨胀,在遥远的将来会达到接近 500 到 600 GB 的大小。
4

2 回答 2

2

我同意您对问题的评论;如果可能的话,你真的应该避免在这里重新发明轮子并使用 ORM。根据经验,您最终将编写代码并解决早已解决的问题,从长远来看,这可能会花费您更多的时间。但是,我知道有时存在不允许使用 ORM 的约束。

以下是一些我认为有帮助的文章:

第一篇文章是一篇旧文章,但它解释了数据访问设计模式的不同选项。它有几种不同的模式,只有你才能真正决定哪一个最适合你,但听起来你可能想看看 Repository Pattern:

http://msdn.microsoft.com/en-us/magazine/dd569757.aspx

下一篇文章是讨论如何使用数据映射器实现存储库模式的系列文章中的第一篇,根据上面的示例,这可能有助于减少一些冗余代码。

http://blogsprajeesh.blogspot.com/2010/02/data-access-layer-in-c-using-repository.html

最后,根据您实现数据访问模式的方式,您可能会发现模板模式和泛型很有帮助。以下文章对此进行了一些讨论,您可以从中收集一些有用的信息:

http://www.c-sharpcorner.com/UploadFile/rmcochran/elegant_dal05212006130957PM/elegant_dal.aspx

如果不了解您的项目的更多信息,很难准确地说出哪种模式最适合您的需求。但是,将工作单元模式与存储库和数据映射器结合使用可能会帮助您重用一些代码并管理您的数据访问。

于 2013-08-27T19:29:23.877 回答
0

我没有看到的是您的模型层。

您有一个业务层和一个 DAO 层,但没有模型。

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.

为什么不是这个:

business layer updates model/domain object A
business layer updates model/domain object A in a different way
business layer persists model/domain to database through data layer.

这样您就可以重复使用,并避免重复循环到数据库。

最终听起来你的业务层对数据库数据模型了解太多了。您需要业务对象,而不仅仅是业务方法。

于 2013-08-28T14:50:07.783 回答