DataProvider vs Repository

Val*_*kiy 6 c# architecture oop 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);
}
Run Code Online (Sandbox Code Playgroud)

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

但是与DataProvider有什么区别?

Fel*_*ani 17

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

知识库

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

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

数据提供者

A DataProvider是提供与数据库连接的组件.一些的dataProvider只能执行一个数据库一样MySql,PostgreSql,Oracle(这些不被.Net框架本身支持),其他的可以用更多的数据库,如OleDb的连接,因为数据库支持它.您可以在此处看到更多内容:

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

如果您想了解更多信息,请查看ADO.NET规范.还有一些类和概念是要知道像重要的Connection,Command,Transaction.

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

它们之间的区别

它们之间的区别在于Repository实现数据库持久性的a使用a 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;
}
Run Code Online (Sandbox Code Playgroud)

实际上,你不需要创建一个PersonDataProvider.dataProvider是ADO.NET类,直接给你一个数据库访问,使用从ADO.NET实现基本接口类一样IDbConnection,IDbCommand,IDbTransaction,等等.现在,如果你想用一个命名您的数据访问类DataProvidersufix,没有问题.

我认为在Repository中有一个ORM类似Entity FrameworkNHibernate实现access数据库的工具很好,而不是带有DataProvider的ADO.NET,并且ISessionFactory在存储库的构造函数中注入了这个ORM的一些依赖项.