在存储库模式中必须创建多少存储库接口

本文关键字:存储 创建 多少 接口 模式 | 更新日期: 2023-09-27 18:00:44

假设我们有以下类:

public class User
{
    //User Definitions Goes Here
}
public class Product
{
    //Product Definitions Goes Here
}
public class Order
{
    //Order Definitions Goes Here
}

有了上面的模型,我应该只创建一个像这样的存储库吗

public interface IRepository
{
    //IRepository Definition Goes Here
}

或者最好有多个存储库:

public interface IUserRepository
{
    //IUserRepository Definition Goes Here
}
public interface IProductRepository
{
    //IProductRepository Definition Goes Here
}
public interface IOrderRepository
{
    //IOrderRepository Definition Goes Here
}

每一个优点和缺点是什么?

在存储库模式中必须创建多少存储库接口

没有必须。您可以根据应用程序的需要创建任意数量的应用程序。您可以为每个业务对象提供一个存储库接口和一个通用接口。

类似的东西

interface ICRUDRepo<T> //where T is always a Domain object
{
    T get(GUid id);
    void Add(T entity);
    void Save(T entity);
 }
//then it's best (for maintainability) to define a specific interface for each case
interface IProductsRepository:ICRUDRepo<Product>
{
    //additional methods if needed by the domain use cases only
    //this search the storage for Products matching a certain criteria,
    // then returns a materialized collection of products 
    //which satisfy the given criteria
    IEnumerable<Product> GetProducts(SelectByDate criteria);
 }

这一切都是关于拥有一个干净清晰的抽象,这将允许域与持久性的适当解耦。

通用抽象在那里,这样我们就可以节省一些按键,可能有一些通用的扩展方法。然而,为这些目的使用通用通用接口并不能真正算作DRY

如果采用第一种方法,就可以避免重复自己的做法,从而满足DRY原则。但是,您通过将未连接的项集中在一个接口和任何实现类中,打破了关注点分离原则。

如果你采用第二种方法,你可以很好地分离关注点,但有重复自己的风险,因此违反了DRY原则。

一种解决方案是第三种方法:混合。

public interface IRepository<T>
{
    IEnumerable<T> Query {get;}
    void Add(TEntity entity);
    void Delete(TEntity entity);
}
public interface IUserRepository : IRepository<IUser>;
public interface IProductRepository : IRepository<IProduct>;
public interface IOrderRepository : IRepository<IOrder>;

然后,这种方法满足这两个原则。