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
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的借口
我同意对你问题的评论;如果可能的话,你应该避免在这里重新发明轮子,而使用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