c# - 数据提供者与存储库

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

最佳答案

首先,让我补充一些概念:

存储库

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

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

数据提供者

A DataProvider是一组提供与数据库连接的组件。一些数据提供者只能实现一个数据库,如 MySql , PostgreSql , Oracle (.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访问数据库实现数据库持久化,因此,repository可以封装一个data provider。

这是一个重要的原则,因为在你的应用程序的层之间保持松散耦合是很好的,换句话说,其他层不想知道它是如何被存储库持久化的,它只是想使确保它会持续存在并在必要时检索。

Repository 中的DataProvider 提供所有数据库访问权限。

一个实际的例子,可以是存储库的一个方法:

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 基础接口(interface)的类,如 IDbConnectionIDbCommandIDbTransaction 等。现在,如果您想使用 DataProvider 后缀命名您的数据访问类,没问题。

我认为有一个像Entity FrameworkNHibernate 这样的ORM 工具在存储库而不是ADO.NET 中实现访问数据库是很好的使用 DataProvider 并在存储库的构造函数中注入(inject)此 ORM 的一些依赖项,例如 ISessionFactory

关于c# - 数据提供者与存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25137518/

相关文章:

java - 类的序列化、演化

java - Java语言中使用的哈希函数

java - 如何将数据与业务逻辑解耦

c# - 任何好的 Winforms 向导库?

oop - 如何打破我的程序编码习惯?

c# - 删除未提交的 DGV 新行

swift - FireBase - 将子项(按原样)移动到不同的路径

architecture - 叶说明(处理器/程序集)

c# - 空字符串上的数据触发

c# - C# 或 VB 中的动态逻辑表达式解析/评估?