DAO 模式在 .NET 中广泛使用吗?

Posted

技术标签:

【中文标题】DAO 模式在 .NET 中广泛使用吗?【英文标题】:Is the DAO Pattern Widely Used in .NET? 【发布时间】:2011-08-13 07:25:26 【问题描述】:

DAO(数据访问对象)是 .NET 中常用的模式吗?我一直使用 DAO 作为提供对我的数据层的访问的一种方式。例如,我的 EntityFramework ObjectContext 上可能有一个薄接口,将我的所有 ObjectSet 暴露为 IObjectSet。

然后 DAO 将公开复杂的查询,每个 DAO 都依赖于该接口。我可能有一个 ProductDAO,它公开了 GetProductsOnSale()GetInfrequenlySoldProducts() 之类的方法。然后,我的控制器或演示者将使用这些方法,这些方法可能是虚拟的,以允许对单元测试的特定结果进行存根。

那么这是 .NET 中常用的习语吗?出于某种原因,我在网上看到的绝大多数使用这种模式的示例都是基于 Java 的。即使是关于 DAO 最佳实践的 this question 也被标记为 Java 而不是 C#。

使用其他社区的东西并没有错,我只是有点担心我周围的每个人都在做不同的事情......

【问题讨论】:

【参考方案1】:

这是 .NET 中的一个常见习语。我用过,也见过很多地方用过。

它内置在框架中 - 请参阅 System.Data 命名空间 - 许多类是专用提供程序(SQL Server、Oracle、mysql 等)的基类,并且在基类上执行操作。

但是,您所描述的内容在我看来更像是 Repository Pattern,而不是简单地使用 Data Access Objects。

这也用于许多项目中,但未内置到框架中。

【讨论】:

我的理解是存储库是公开所有IObjectSet<T> 成员的“东西”,DAO 是使用存储库构建查询的类。这与您使用这些术语的方式一致吗? @Adam - 不是真的,DAO抽象 实际的 DB 接口,Repository 是抽象使用 DAO 来表示一个应该是“内存中”的集合。 我明白了。你会怎么称呼接受存储库实例并公开复杂查询的对象?当然,将所有(可能很多)查询转储到您的存储库中肯定不是一个好主意……我想事情很快就会变得非常混乱 @Adam - 对于在简单界面后面协调复杂交互的东西 - 我会使用 Facade pattern 作为代码和存储库之间的链接。【参考方案2】:

我广泛使用 DAO 模式。

您提到了实体框架;除此之外,我要补充一点,我发现 DAO 比 DataSets 和 DataTables 好得多,它们太像数据库了,不像我喜欢的对象。例如,不能将 DataRows 添加到多个数据表中,因此我无法将加载的数据的子集传递给不同的对象,除非将它们移动到不是为包含它们而构建的容器中。 (即,DataRow 似乎应该在 DataTable 中,但它们一次只能在一个 DataTable 中。)DataRowView 很笨重,不如将实体对象添加到另一个列表那么直观。

【讨论】:

【参考方案3】:

对于使用存储库模式来封装数据访问(这确实是一个非常好的模式),我最大的建议是能够创建一个通用存储库。但是要创建一个非常智能的通用存储库,它可以让您基本上实时连接以立即访问所有标准 CRUD 操作,以及访问复杂的查询构造,您不会暴露给您ISomeService 外观。

使用通用存储库最重要的一点是,您希望它基于构造函数注入,而不是基于继承。通过这种方式,您可以编写 SomeService 以依赖于实现有意义的业务域边界所需的许多通用存储库。

我就这个概念写了一篇深入的博客。 Creating a common generic and extensible NHiberate Repository version 2。虽然这篇博文专门针对 NHibernate 的引用,但您可以采用相同的核心概念并将它们应用于几乎任何 DAO

注意一些工具,例如 Entity Framework、Linq2Sql 和 RavenDB 等等,它们本身公开了非常精炼的存储库,可能不一定会从添加额外的包装器中受益。

【讨论】:

以上是关于DAO 模式在 .NET 中广泛使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

CSS 类名中广泛支持哪些字符?

如何使用泛型实现 Hibernate DAO

我应该默认使用GenSeq吗?

在 .NET 中合并两个数组

java web spring jpa 在以接口为dao的方法里使用原生sql,联合查找没有对应实体,用啥来接收? 求大神

JPA的泛型DAO设计及使用