我正在将存储库模式实现为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): }
很明显,如何使用这样的存储库来添加,更新,删除或获取单个类型的实体.但是,如何处理创建和操作不同类型之间的一对多或多对多关系?
假设您有一个项目类型,每个项目分配给一个类别.您将如何通过存储库进行此作业?是否应该更新(类别c)和/或更新(项目i)方法来确定需要更新或更新元素的关系?还是应该有一个明确的AssignCategoryToItem(Item i,Category c)方法?
如果有任何区别,我使用Fluent NHibernate来实现我的具体存储库.
解决方法
你的应用程序如何处理一个类别到一个项目?
可以:
>允许用户查看该项目,然后为其分配一个类别
>允许用户查看类别,然后添加项目
让你的应用程序指定你选择哪种方法.
这提出了拥有业务逻辑/服务层和处理aggregate roots的想法.在我的应用程序中,我总是有一个所有业务逻辑的服务层.我发现这样做使我的应用程序更容易理解和维护/重构. (注意:我还使用通用存储库,并将复杂的存储库查找放在适当的服务类中的单独的函数中)
在您的服务层中,您将有一个名为AssignCategoryToItem的函数,然后将其分类(聚合根),然后将该项添加到该类别并保存更改 – 尽管我希望传递类别的ID并在更新之前将其从数据库中拉出.