如何处理与存储库模式的表关系?

Eri*_*tas 12 asp.net-mvc many-to-many one-to-many fluent-nhibernate repository-pattern

我正在将存储库模式实现为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):
}
Run Code Online (Sandbox Code Playgroud)

我很清楚如何使用这样的存储库来添加,更新,删除或获取单一类型的实体.但是,您如何处理创建和操纵不同类型之间的一对多或多对多关系?

假设您有一个Item类型,其中每个项目都分配给a Category.您将如何通过存储库进行此分配?这应该取决于Update(Category c)和/或Update(Item i)方法来确定需要与正在更新的元素建立什么关系?或者应该有一个明确的AssignCategoryToItem(Item i, Category c)方法?

如果它有任何区别我正在使用Fluent NHibernate来实现我的具体存储库.

Oma*_*mar 3

您的应用程序如何处理为项目分配类别?

可以:

  1. 允许用户查看项目然后为其分配类别
  2. 允许用户查看类别然后向其中添加项目

让您的应用决定您选择哪种方法。

Business Logic/Services这就提出了拥有一个层并处理聚合根的想法。在我的应用程序中,我总是有一个services所有业务逻辑所在的层。我发现这样做使我的应用程序更易于理解和维护/重构。(注意:我还使用通用存储库,并将复杂的存储库查找放在适当服务类中的单独函数中)

在您的services层中,您将有一个名为的函数AssignCategoryToItem,该函数将获取类别(聚合根),然后您将向其中添加项目category并保存更改 - 尽管我更喜欢传入IDs类别的 并将其从中提取更新前的数据库。