每个人都知道面向对象语言提供了可重用性功能。
我有一个简单的三层应用程序:
我一直在努力在此数据层中强制执行代码可重用性。我在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查询而不记住可重用性,那么就会对数据库进行一次调用。
那么,是否有任何模式或技术可以在数据层中实现可重用性?
注意:
<小时/> 不考虑任何ORM的借口。
答案 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过多的数据库数据模型。您需要业务对象,而不仅仅是业务方法。