DataProvider vs Repository

时间:2014-08-05 11:19:09

标签: c# oop architecture ado.net inversion-of-control

DataProvider和Repository有什么区别?在选择如何命名我的班级时,我应该使用什么逻辑?

存储库模式或多或少地描述了类:

internal interface IPersonRepository{
  public void Update(Person p);
  public void Add(Person p);
  public Person Get(int id);
  public IEnumerable<Person> GetBatch();
  public void Delete(Person p);
}

这是一种理论,但在现实生活中可能还有其他更具体的方法,如GetListPerson(int[] ids)等。

但与DataProvider有什么区别?

2 个答案:

答案 0 :(得分:16)

首先,让我添加一些概念:

存储库

Repository是一种允许您在一个地方存储对象的模式,可以是数据库,xml,txt,日志等。某些应用程序使用存储库来实现数据库持久性并使用它在应用程序的业务逻辑层上。查看这篇文章了解更多信息。

http://msdn.microsoft.com/en-us/library/ff649690.aspx

数据提供者

DataProvider是一个提供与数据库连接的组件。一些dataProviders只能实现一个数据库,如MySqlPostgreSqlOracle(.Net Framework本身不支持这些数据库),其他数据库可以连接更多数据库,如OleDb,因为数据库支持它。你可以在这里看到更多内容:

http://msdn.microsoft.com/en-us/library/a6cd7c08(v=vs.110).aspx

如果您想了解更多信息,请查看ADO.NET specification。有一些类和概念很重要,比如ConnectionCommandTransaction

http://msdn.microsoft.com/en-us/library/h43ks021(v=vs.71).aspx

他们之间的区别

它们之间的区别是a 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基本接口的类直接为您提供数据库访问,如IDbConnectionIDbCommandIDbTransaction等。现在,如果您想要使用DataProvider sufix命名您的数据访问类,没问题。

我认为使用ORMEntity Framework工具在存储库中实现访问数据库而不是使用DataProvider的ADO.NET并注入此ORM的某些依赖项是很好的像存储库的构造函数中的NHibernate一样。

答案 1 :(得分:0)

Repository和DataProvider是两回事。

存储库是一种模式,您在查询数据库时应该采用该模式。 (就像你在问题中提到的那样)

DataProvider是一个.net组件,用于从您指定的源中检索数据。有关.Net DataProviders的更多信息,请访问:http://msdn.microsoft.com/en-us/library/s7ee2dwt%28v=vs.71%29.aspx