【问题标题】:DataProvider vs Repository数据提供者与存储库
【发布时间】:2021-08-26 21:36:16
【问题描述】:

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 有什么区别呢?

【问题讨论】:

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


    【解决方案1】:

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

    存储库

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

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

    数据提供者

    DataProvider 是一组提供与数据库连接的组件。一些dataProviders只能实现一个数据库,如MySqlPostgreSqlOracle(.Net本身不支持这些),其他的可以连接更多的数据库,如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

    它们之间的区别

    它们之间的区别在于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 后缀,没问题。

    我认为有一个ORM 工具(如Entity FrameworkNHibernate)在Repository 中实现访问数据库而不是ADO.NET 与DataProvider 并注入此ORM 的一些依赖项(如ISessionFactory)内部是很好的存储库的构造函数。

    【讨论】:

    • 这个答案非常好,但我想我的问题是以错误的方式提出的,我的意思是:如果我想创建类 PersonDataProvider 怎么办。从 OOP 的角度来看,这个类应该做什么,与 PersonRepository 有什么区别?正如我从您的回答中了解到的那样 - PersonDataProvider 应该向 PersonRepository 提供与 PersonDataProvider 中指定的存储进行通信的能力?
    • @ValentynVynogradskiy 我编辑了我的答案。在您的问题中,DataProvider 给人的印象是您引用的是 ADO.NET 提供的不是软件方法。
    【解决方案2】:

    Repository 和 DataProvider 是两个不同的东西。

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多