我正在将存储库模式实现为ASP.NET MVC站点的一部分。我见过的大多数关于存储库的例子都很简单。例如,这是一个典型的抽象存储库接口。
public interface IRepository<TEntity>
{
IQueryable<TEntity> All();
TEntity FindBy(int id);
TEntity FindBy(Expression<Func<TEntity, bool>> expression);
IQueryable<TEntity> FilterBy(Expression<Func<TEntity, bool>> expression);
bool Add(TEntity entity);
bool Update(TEntity entity);
bool Delete(TEntity entity):
}
我很清楚如何使用这样的存储库来添加,更新,删除或获取单一类型的实体。但是,您如何处理创建和操纵不同类型之间的一对多或多对多关系?
假设您有Item
类型,其中每个项目都分配给Category
。您将如何通过存储库进行此分配?这应该取决于Update(Category c)
和/或Update(Item i)
方法,以确定需要与正在更新的元素建立什么关系?或者是否应该有明确的AssignCategoryToItem(Item i, Category c)
方法?
如果它有任何区别我正在使用Fluent NHibernate来实现我的具体存储库。
答案 0 :(得分:1)
您的应用如何处理为项目分配类别?
是吗:
让你的应用决定你选择哪种方法。
这提出了拥有Business Logic/Services
图层并处理aggregate roots的想法。在我的应用程序中,我总是有一个services
层,其中包含所有业务逻辑。我发现这样做使我的应用程序更容易理解和维护/重构。 (注意:我还使用通用存储库,并将复杂的存储库查找在适当的服务类中的单独函数中)
在services
图层中,您将拥有一个名为AssignCategoryToItem
的函数,然后将其作为类别(聚合根),然后您将该项添加到category
和保存更改 - 虽然我希望在更新之前传入类别的IDs
并从数据库中提取它。
答案 1 :(得分:0)
一旦定义了聚合根,就应该为这些接口创建非常具体的存储库接口(例如IProductRepository),并让服务层使用它们。
比如......
public interface IProductRepository
{
IList<Product> GetProductsInCategory(Category c);
Product GetProductBy(int id);
IList<Category> GetActiveProductCategories();
}
然后,在IProductRepository的具体实现中,您将使用通用存储库并查询相关实体并根据需要加入它们。