首先,让我添加一些概念:
存储库
Repository 是一种模式,它允许您将对象存储在一个地方,可以是数据库、xml、txt、日志、配置等任何东西。一些应用程序使用存储库来实现数据库持久性,并使用它在应用程序的业务逻辑层。查看这篇文章了解更多信息。
http://msdn.microsoft.com/en-us/library/ff649690.aspx
数据提供者
DataProvider 是一组提供与数据库连接的组件。一些dataProviders只能实现一个数据库,如MySql、PostgreSql、Oracle(.Net本身不支持这些),其他的可以连接更多的数据库,如OleDb,因为数据库支持它。您可以在此处查看更多信息:
http://msdn.microsoft.com/en-us/library/a6cd7c08(v=vs.110).aspx
如果您想了解更多信息,请查看ADO.NET specification。有些类和概念很重要,比如Connection、Command、Transaction。
http://msdn.microsoft.com/en-us/library/h43ks021(v=vs.71).aspx
它们之间的区别
它们之间的区别在于Repository实现了数据库持久化,使用Data Provider访问数据库,因此,存储库可以封装数据提供者。
这是一个重要的原则,因为在应用程序的层之间保持松散耦合是很好的,换句话说,其他层不想知道它是如何被存储库持久化的,它只是想使确保它会持续存在并在必要时检索。
为DataProvider 内的Repository 提供所有数据库访问权限。
一个实际的示例,可以是存储库的一个方法:
public Person Get(int id);
{
Person p = null;
using (var con = new SqlConnection("your connection string"))
{
con.Open();
using (var command = new SqlCommand("select * from Person where id = @id", con))
{
command.Parameters.AddWithValue("@id", id);
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
p = new Person();
p.Name = reader["Name"].ToString();
// other properties....
}
}
}
con.Close();
}
return p;
}
实际上,您不需要创建PersonDataProvider。 DataProvider 是 ADO.NET 类,它直接为您提供数据库访问,使用实现来自 ADO.NET 的基本接口的类,如 IDbConnection、IDbCommand、IDbTransaction 等。现在,如果您想用以下名称命名您的数据访问类DataProvider 后缀,没问题。
我认为有一个ORM 工具(如Entity Framework 或NHibernate)在Repository 中实现访问数据库而不是ADO.NET 与DataProvider 并注入此ORM 的一些依赖项(如ISessionFactory)内部是很好的存储库的构造函数。