关系数据库和面向对象的环境

时间:2013-08-27 17:57:08

标签: c# design-patterns architecture language-agnostic ado.net

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

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

  1. 表示层
  2. 业务层旨在获得可重用性的好处
  3. datalayer是一个愚蠢的ado.net库(通过dumb我的意思是它没有业务逻辑。)
  4. 我一直在努力在此数据层中强制执行代码可重用性。我在datalayer中的一个方法中粘贴伪模式。

    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。
    3. <小时/> 不考虑任何ORM的借口。

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

2 个答案:

答案 0 :(得分:2)

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

以下是我发现有用的一些文章:

这篇文章很旧,但它解释了您对数据访问设计模式的不同选择。它有一些不同的模式,只有你可以真正决定哪一个最适合你,但听起来你可能想要查看存储库模式:

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

在不了解您的项目的情况下,很难确切地说,哪种模式最适合您的需求。但是,将工作单元模式与存储库和数据映射器结合使用可能会帮助您重用某些代码并管理数据访问。

答案 1 :(得分: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.

通过这种方式,您可以重复使用,并避免重复循环到数据库。

最终,听起来您的业务层知道FAR过多的数据库数据模型。您需要业务对象,而不仅仅是业务方法。