【问题标题】:Better solutions for a Database Access Layer than my .NET assembly solution?比我的 .NET 程序集解决方案更好的数据库访问层解决方案?
【发布时间】: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


【解决方案1】:

我认为不知道任何细节,假设较小的项目没有太多客户,我会说坚持使用 dll,并确保其最新版本位于文件共享或可下载的 url通过脚本,最好是自动构建过程。

啊,不太清楚您所说的数据访问服务层是什么意思。
我认为在这方面提供良好的反馈,我们需要知道有多少客户、客户类型、其中有什么样的方法(我认为复杂对象的大量选择查询不适合 WCF 或类似的)。此外,由于 WCF 用途广泛,它会在同一台机器上、通过 LAN 还是通过 Internet?

我稍微使用过 WCF,但不是真的在那种情况下。

只要您所做的所有更改都不会违反合同(仅添加新方法),它可能比您的 DLL 更模块化,但我想说如果您需要从不同平台访问它,那么会有很大的好处,或足够多的客户端导致数据库连接紧张。 WCF 的某些错误可能难以调试。如果您确实必须违反合同,您必须向他们发送一个新的 servicecontract.cs 文件,仍然

【讨论】:

    【解决方案2】:

    根据我对您的问题和客户需求的理解,我相信他们正在谈论一些类似于 SOA 或面向服务的架构的东西。根据 SOA 原则,它确实允许采用模块化和松散耦合的方法。这可以导致更容易维护,因为可以更改、更新和/或维护数据访问例程的逻辑而不影响客户端。此外,假设您有 20 个使用“服务”的客户端 - 无需为所有使用“服务”或 DAL 的客户端更新和部署新的 dll。

    就用于实现 SOA 系统的平台或技术而言,它可以是您选择的任何东西。或者更准确地说,任何适合这项工作的工具。你可以自己滚动,你可以使用 WCF 或者你也可以使用 WebAPI...等等...

    以下是有关该主题的一些链接:

    Introduction to SOA - JavaWorld

    Service Oriented Architecture with .NET

    Service Oriented Architecture and Microsoft .NET

    MS Architecture Journal #21 - SOA Today and Past

    Understanding Service Oriented Architecture

    【讨论】:

    • 毕竟我刚刚意识到这个问题已经有一年多了。 ://
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多