【问题标题】:Different database repository implementations behind single interface单一接口背后的不同数据库存储库实现
【发布时间】:2014-02-01 07:03:13
【问题描述】:

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

首先,我想支持两种类型的数据库通信 - 直接 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() 函数,我需要将它留空以用于“简单”存储库。

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

提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

    您可以有第二个接口继承IRepository,它具有Sync 方法,并且只有批量存储库实现了该方法。在这种情况下,您仍然可以访问两个存储库methods defined byIProductRepository`

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

    【讨论】:

    • 我想为每种对象类型提供一个单独的接口来控制所支持的功能。我确实喜欢您对第二个界面的想法-我认为这就是我要解决的问题。这也将允许我检查存储库是否实现 ICommitChanges - 将更改同步到数据库。
    【解决方案2】:

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

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

    Repository and Unit of Work patterns - How to save changes

    【讨论】:

    • 在其他情况下,我确实有一个提交(使用 UnitOfWork)。但是,在这种情况下,我不想提交,因为我正在处理的不是典型的事务系统(我不想持久化更改或使用事务)。不过,这确实是我会考虑的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2018-03-30
    • 2013-02-03
    相关资源
    最近更新 更多