Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关系数据库与面向对象环境_C#_Design Patterns_Architecture_Language Agnostic_Ado.net - Fatal编程技术网

C# 关系数据库与面向对象环境

C# 关系数据库与面向对象环境,c#,design-patterns,architecture,language-agnostic,ado.net,C#,Design Patterns,Architecture,Language Agnostic,Ado.net,每个人都知道,面向对象语言提供了可重用性特性 我有一个简单的三层应用程序: 表示层 业务层旨在获得可重用性的好处 datalayer是一个愚蠢的ado.net库(我所说的愚蠢是指它没有适当的业务逻辑) 我一直在努力在这个数据层中实现代码的可重用性。我正在数据层的一个方法中粘贴一个伪模式 create connection object open connection to database create a transaction object begin transaction create

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

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

  • 表示层
  • 业务层旨在获得可重用性的好处
  • 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代码删除
  • 6个月前我上网查了一下,结果只有 当时有两种流行或广泛使用的ORM解决方案。实体 框架和NHibernate。我选择实体框架(出于某些原因 我将稍后链接,此外,我有一种感觉,与EF合作将很容易,因为它是由微软提供的)开始学习
  • 我在这本书中用了这个 据我所知,有三种技巧 , 和 ; 我从未试过
  • 当我检查从实体框架生成的SQL时,它是 非常难看,正在创建一些额外的列:ID,一些难看的大小写 语句等,对于高度事务性的系统 ORM解决方案无法应用。高度事务性系统是指每分钟发生1000次插入。该数据库的规模不断扩大,在不久的将来将达到500到600 GB

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

    以下是一些我觉得有用的文章:

    第一篇文章很老,但它解释了数据访问设计模式的不同选项。它有几种不同的模式,只有您才能真正决定哪种模式最适合您,但听起来您可能想看看存储库模式:

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

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


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

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

    您有一个业务层和一个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.
    
    这样您就可以重复使用,并避免重复地来回循环到数据库


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

    动态SQL是唯一想到的东西,但它同样混乱(如果不是更混乱的话)。你不使用ORM的理由是什么?“我希望有人提出一个解决方案,除了请不要建议每个人都会推荐的解决方案。我想要一个不同的解决方案。”为什么不考虑ORM解决方案呢?不要重新发明轮子。像EF和NHibernate这样的ORM框架不仅已经解决了您面临的问题,而且它们都有很好的文档记录,并且很久以前就解决了您将遇到的许多错误,如果您出于某种原因坚持自己动手,那么您可以尝试自己动手,阅读泛型和工作单元pattern@RyanHenderson我同意你的看法,动态SQL是我想到的最丑陋的东西。我永远不会使用它,即使这是这个宇宙中剩下的唯一选项:)我想你的意思是:这些对象在跨层对话中充当载体,在这种情况下,业务层与数据层对话。是的,有一个单独的项目有所有这样的DTO;为了简单起见,我没有在这里展示。这里还有一个有趣的地方需要注意,在一些来自业务层的数据库调用中,我不需要任何DTO,我只需要传递一些基本数据类型,如int、string等。您能举个例子吗?这样的电话是什么样子的?是不是有点像:setCust