【发布时间】:2011-11-16 14:04:01
【问题描述】:
在接下来的工作中,我将着眼于对现有系统的部分重写。其中一个是 DAL,它被实现为 .NET 程序集,由一些应用程序引用,并提供将事物推送到底层 DB 并从该 DB 检索数据的方法。本质上,我为 DLL 的用户提供了一种连接到某些 DB 并对其进行有限调用的方法。他们使用我定义的接口,而不是用户自己编写 SQL。
现在已经讨论了使用某些数据访问服务层来代替现有的 DLL,并且这种方法的支持者引用的好处是它是“可维护的”、“可测试的”、“可扩展的”——所有标准的流行语.也有人声称这种方法以某种方式最小化了对使用该层的应用程序的影响,因为它隔离了更改,尽管我不相信是这种情况。在我看来,底层数据库和应用程序之间的任何层都将具有定义明确的接口,因此在任一侧所做的不涉及接口另一侧的更改将是不可见的并且没有实际影响.同样,确实影响另一方的任何更改也可能需要更改该中间层。我不明白它是怎么做到的。
预计将需要对 DAL 进行早期更改,因为,嗯,内容发生了变化。方法参数发生变化,这导致我目前重新编译 DAL 程序集并将其分发给 DAL 的用户。这些不会经常发生,但确实会发生。我在这方面可能有点天真,但我不知道有比我目前拥有的更好的方法来让应用程序脱离 DB 接口业务。是否有人对提供更好模块化的 DAL 解决方案有专门的了解?我在网上和其他地方读过一些帖子,但没有人真正谈论这个。如果现有问题已经解决了这个问题,我很想看到这个链接,并且很乐意结束这个问题。
其他信息:
我上面的长问题的一个简短版本是“不使用我目前采用的 DLL 方法会有什么优势?”我目前采用的模型具有以下特点:
- 一些抽象底层 DB 模型的 POCO 类(这些类目前不是自动生成的,而是手工构建的,虽然我猜它们可以通过 EF 或类似的东西自动生成,但我不确定这真的很重要)
- 许多可以调用的公共方法,例如
GetOrderDetails(int orderID)或SubmitOrder(Order newOrder) - 它通过应用程序使用 DLL 提供的输入处理 DB 连接字符串
【问题讨论】:
-
几个问题:数据访问服务层有何不同?这会像使用 Linq2Sql 并且用户会在其中编写查询而不是使用您的函数吗?我认为你的 DLL 会比任何其他实现更容易构建测试用例......
-
@Thymine - 有人谈论正在使用 WCF 数据服务之类的东西 - 嗯,特别提到了 OData 参与其中,我收集到 WCF 数据服务是他们正在考虑的。我没有花足够的时间看这个,但从我 5 秒的游览来看,我不相信它会更好,除非我在这里遗漏了一些东西。
-
如果你的数据访问层的接口定义得这么好(这是一件了不起的事情),那么它的消费者肯定不应该知道或关心它是如何实现的吗?它可以是您提到的 ORM、消息队列或 WCF 数据服务,只要所有这些实现都满足 DAL 合同,没有人需要知道!这是受保护变化的原则:)
-
@MattDavey - 感谢您的评论。似乎新的/不同的 DAL 层的支持者认为,不同的实现会以某种方式隔离更改,我不确定我是否坦率地说。例如,当数据库中的事物发生变化时,导致该数据的消费者/生产者可以使用新的/不同的事物,无论采用何种 DAL,这些变化必然会向外扩散,除非有一些我不知道的解决方案知道。
-
@itsmatt 我想这是一个观点问题。在我看来,DAL 接口/合同是规范,DAL 实现致力于实现它,域/应用层使用它。任何新的数据访问要求都应首先添加到 DAL 接口,立即使以前的 DAL 实现无效,因此他们必须实现新功能。从本质上讲,它是驱动数据库变化的接口,而不是反过来……
标签: c# .net data-access-layer