是.net中广泛使用的DAO模式吗?

本文关键字:DAO 模式 net | 更新日期: 2023-09-27 17:52:57

dao -数据访问对象-是。net中常用的模式吗?我一直使用dao来提供对数据层的访问。例如,我可能在我的EntityFramework ObjectContext上有一个瘦接口,将我所有的objectset暴露为IObjectSet。

然后,复杂的查询将由dao公开,每个dao都依赖于该接口。我可能有一个ProductDAO,它公开GetProductsOnSale()GetInfrequenlySoldProducts()这样的方法。然后,我的控制器或演示程序将使用这些方法,这些方法可能是虚拟的,以便为单元测试提供特定的存根结果。

这是。net中常用的习惯用法吗?出于某种原因,我在网上看到的使用这种模式的绝大多数示例都是基于Java的。甚至这个关于DAO最佳实践的问题也被标记为Java而不是c#。

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

是.net中广泛使用的DAO模式吗?

这是。net中常见的习惯用法。我用过它,也看到它在许多地方被使用过。

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

然而,你所描述的听起来更像是存储库模式,而不仅仅是数据访问对象的使用。

这也在许多项目中使用,尽管没有内置到框架中。

我广泛使用DAO模式。

你提到了实体框架;对此,我想补充一点,我发现DAO比数据集和数据表要好得多,它们太像数据库了,而不像我喜欢的对象。例如,datarow不能被添加到多个数据表中,所以我不能将加载数据的子集传递给不同的对象,而不将它们移动到一个不是为包含它们而构建的容器中。(也就是说,看起来一个DataRow应该在一个数据表中,但它们一次只能在一个数据表中。)DataRowViews很笨拙,而且不像在另一个列表中添加实体对象那样直观。

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

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

我写了一篇关于这个概念的深度博客。创建一个通用的、可扩展的nhibernate存储库版本2。虽然这篇博文是专门针对NHibernate的,但你可以把同样的核心概念应用到几乎所有的DAO上。

注意一些工具,如Entity Framework, Linq2Sql和RavenDB等等,它们暴露了非常精致的存储库本身,并且可能不一定从添加额外的包装器中受益。