单一界面背后的不同数据库存储库实

时间:2014-01-13 13:50:29

标签: c# architecture repository-pattern data-access-layer

我正在开发一个我需要编写数据访问层的应用程序。我的第一个想法是为我需要的每个实体创建一堆存储库,但我现在面临着分离存储库的不同操作的挑战。我想听听你对此的看法。

首先,我想支持两种类型的数据库通信 - 直接sql查询(例如,插入,更新等)和批量插入,如从文件(或其他源)加载数据。但是,这两种实现都做了不同的事情:

  • 简单存储库触发查询到SQL服务器
  • 批量存储库首先将记录添加到文件或内存中。处理完所有记录后,它会与数据库同步。

我对类结构的第一次尝试是:

  public class Product{

  }

  public interface IProductRepository {
    Product GetProduct(int id);
    void CreateProduct(Product p);
  }

  public class SqlProductRepository : IProductRepository
  {
    public Product GetProduct(int id)
    {
      throw new NotImplementedException();
    }

    public void CreateProduct(Product p)
    {
      throw new NotImplementedException();
    }   
  }

  public class BulkLoadRepository : IProductRepository
  {
    public Product GetProduct(int id)
    {
      throw new NotImplementedException();
    }

    public void CreateProduct(Product p)
    {
      throw new NotImplementedException();
    }    
  }

但是,此结构在批量存储库的末尾缺少同步功能。如果我最终添加了一个Sync()函数,我将需要将它留空以用于“简单”存储库。

有关如何支持这两种功能但仍将它们隐藏在一个界面后的任何想法?

提前致谢!

2 个答案:

答案 0 :(得分:0)

首先,为什么要为每种对象类型创建一个接口。例如,存储库通常只有Get,Create,Update,Delete方法,也许是一个通用的Get ...其中IRepository也是通用的。

您可以拥有继承IRepository的第二个接口,该接口具有Sync方法,只有Bulk存储库实现该接口。在这种情况下,您仍然可以访问两个存储库methods defined by IProductRepository`

或者有一个Bulk存储库的基类来实现/定义同步。

答案 1 :(得分:0)

我不确定为什么你会为简单的存储库留空。在我的大多数存储库中同步==提交。虽然更准确地说这是UnitOfWork模式,而不是存储库模式。

对于事务系统,公开单独的提交方法非常常见。

Repository and Unit of Work patterns - How to save changes