11

我正在实施存储库模式作为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)方法?

如果它有什么区别我使用流利NHibernate来实现我的具体存储库。

回答

0

您的应用程序如何处理将项目分配给项目?

它:

  1. 允许用户查看的项目,然后为它分配一个类别
  2. 允许查看的类别的用户,然后项目添加到它

让你的应用程序听写你选择哪种方法。

这提出了一个Business Logic/Services图层和处理aggregate roots的想法。在我的应用程序中,我总是有一个services层,其中所有的业务逻辑都在。我发现这样做使我的应用程序更易于理解和维护/重构。 (注:我也用通用的存储库,并把在不同的功能复杂的存储库中查找UPS在适当的服务类)

在你services层,你就会有一个叫AssignCategoryToItem功能,那么它会使用类别(总根),然后您将该项添加到该category并保存更改 - 虽然我宁愿传递该类别的IDs并在更新之前从数据库中拉出它。

+0

好吧我认为这是有道理的。我不确定的一件事情是“服务”类中的逻辑与我实际模型类中的逻辑会发生什么? – 2011-05-18 19:04:33

+0

让您的模型类只代表模型/应用程序对象。不要把逻辑放在它们中 - 保持简单。让您的服务类负责繁重的工作 - 即数据库调用,复杂的业务逻辑/验证。让模型成为用于将信息从存储库/数据库传输到服务层并返回的对象。 – Omar 2011-05-18 19:10:23

0

一旦你定义了你的聚合根,你应该为它们创建非常具体的存储库接口(比如IProductRepository),并让你的服务层使用它们。

如...

public interface IProductRepository 
{ 
    IList<Product> GetProductsInCategory(Category c); 
    Product GetProductBy(int id); 
    IList<Category> GetActiveProductCategories(); 
} 

然后在你的具体实施IProductRepository,你会消耗通用信息库及查询您的相关实体,并根据需要加入他们的行列。