Asp.net mvc 如何使用存储库模式处理表关系?

Asp.net mvc 如何使用存储库模式处理表关系?,asp.net-mvc,fluent-nhibernate,many-to-many,repository-pattern,one-to-many,Asp.net Mvc,Fluent Nhibernate,Many To Many,Repository Pattern,One To Many,我正在作为ASP.NETMVC站点的一部分实现存储库模式。我看到的大多数存储库示例都相当简单。例如,这里有一个典型的抽象存储库接口 public interface IRepository<TEntity> { IQueryable<TEntity> All(); TEntity FindBy(int id); TEntity FindBy(Expression<Func<TEntity, bool>> expression

我正在作为ASP.NETMVC站点的一部分实现存储库模式。我看到的大多数存储库示例都相当简单。例如,这里有一个典型的抽象存储库接口

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):
}
公共接口IRepository
{
IQueryable All();
TEntity FindBy(int-id);
TEntity FindBy(表达式);
可计量过滤器(表达式);
bool-Add(TEntity实体);
bool更新(TEntity实体);
bool Delete(tenty实体):
}
我很清楚如何使用这样的存储库来添加、更新、删除或获取单一类型的实体。但是如何处理不同类型之间的一对多或多对多关系的创建和操作呢

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


如果有什么不同,我将使用Fluent NHibernate来实现我的具体存储库。

你的应用程序如何处理将类别分配给项目的问题

它是否:

  • 允许用户查看项目,然后为其分配类别
  • 允许用户查看类别,然后向其中添加项目
  • 让你的应用程序决定你选择哪种方法

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


    服务
    层中,您将有一个名为
    AssignCategoryToItem
    的函数,该函数将获取类别(聚合根)然后将该项添加到该
    类别中并保存更改-尽管我更希望在更新之前传入该类别的
    ID
    ,并从数据库中提取它。

    一旦定义了聚合根,就应该为这些项创建非常特定的存储库接口(例如IPProductRepository),并让您的服务层使用它们

    比如

    public interface IProductRepository
    {
        IList<Product> GetProductsInCategory(Category c);
        Product GetProductBy(int id);
        IList<Category> GetActiveProductCategories();
    }
    
    公共接口存储库
    {
    IList GetProductsInCategory(c类);
    产品GetProductBy(int-id);
    IList GetActiveProductCategories();
    }
    

    然后在IPProductRepository的具体实现中,您将使用通用存储库并查询相关实体,并根据需要加入它们。

    好的,我认为这是有意义的。我不确定的一点是,“服务”类中的逻辑是什么,而实际的模型类中的逻辑是什么?让您的模型类只表示模型/应用程序对象。不要把逻辑放在它们里面——保持它们的简单。让您的服务类负责繁重的工作,即数据库调用、复杂的业务逻辑/验证。让您的模型成为您用来将信息从存储库/db传输到服务层和服务层的对象。