DAO数据访问对象是.NET中常用的模式吗?我一直使用DAO作为提供访问我的数据层的方法。例如,我可能在我的EntityFramework ObjectContext上有一个瘦接口,将我的所有ObjectSet暴露为IObjectSet。
然后DAO将公开复杂查询,每个DAO都依赖于此接口。我可能有一个ProductDAO,它公开了GetProductsOnSale()
或GetInfrequenlySoldProducts()
等方法。然后我的控制器或演示者将使用这些方法,这些方法可能是虚拟的,以允许对单元测试的特定结果进行存根。
这是.NET中常用的习惯用法吗?出于某种原因,我在线使用此模式看到的绝大多数示例都基于Java。甚至关于DAO最佳实践的this question也被标记为Java而不是C#。
使用来自其他社区的东西没有任何问题,我只是有点担心我身边的每个人都在以不同的方式做事......
答案 0 :(得分:9)
这是.NET中常见的习语。我已经使用过它并且已经在许多地方使用过它。
它内置于框架中 - 请参阅System.Data
命名空间 - 许多类是专用提供程序的基类(SQL Server,Oracle,MySQL等...),并且操作在基类上执行。
但是,你所描述的内容听起来更像Repository Pattern,而不仅仅是使用Data Access Objects。
这也用在许多项目中,但没有内置到框架中。
答案 1 :(得分:1)
我广泛使用DAO模式。
您提到了实体框架;我要补充一点,我发现DAO比DataSets和DataTables要好得多,DataSets和DataTables太像一个数据库了,不足以满足我的口味。例如,DataRows无法添加到多个数据表中,因此我无法将加载数据的子集传递给不同的对象,而无需将它们移动到未构建为包含它们的容器。 (即,似乎DataRow应该在DataTable中,但它们一次只能在一个DataTable中。)DataRowViews很笨重,并不像将实体对象添加到另一个列表那样直观。
答案 2 :(得分:1)
我最大的建议是使用Repository模式来封装数据访问(这确实是一个非常好的模式),就是能够创建一个通用的存储库。但要创建一个非常智能的通用存储库,它可以为您提供基本的实时连接,以便立即访问所有标准CRUD操作,同时访问您不会通过ISomeService
外观公开的复杂查询结构。
使用通用存储库最重要的是,您希望它基于构造函数注入而不是基于继承。这样,您可以将SomeService
组合为依赖于实现有意义的业务域边界所需的许多通用存储库。
我写了一篇关于这个概念的深入博客。 Creating a common generic and extensible NHiberate Repository version 2。虽然这篇博文在NHibernate的参考文献中是特定的,但您可以采用相同的核心概念并将其应用于几乎所有DAO
。
注意一些工具,例如Entity Framework,Linq2Sql和RavenDB等,它们本身会暴露出非常精致的存储库,并且可能不一定会因添加额外的包装器而受益。