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

时间:2011-05-11 22:02:23

标签: asp.net-mvc fluent-nhibernate many-to-many repository-pattern one-to-many

我正在将存储库模式实现为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来实现我的具体存储库。

2 个答案:

答案 0 :(得分:1)

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

是吗:

  1. 允许用户查看该项目,然后为其指定一个类别
  2. 允许用户查看类别,然后向其添加项目
  3. 让你的应用决定你选择哪种方法。

    这提出了拥有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的具体实现中,您将使用通用存储库并查询相关实体并根据需要加入它们。