在存储库模式中必须创建多少存储库接口
本文关键字:存储 创建 多少 接口 模式 | 更新日期: 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>;
然后,这种方法满足这两个原则。