使用存储库模式的MVC搜索功能

时间:2014-07-20 14:07:48

标签: asp.net-mvc repository-pattern

我正在尝试使用存储库模式,域模型和服务层在应用程序中构建一个简单的搜索功能。

我一直在搜索并找不到任何适合存储库模式的内容。我已经快速阅读了规范方法,但看起来它不符合我的要求。请继续阅读。

一个典型的搜索将涉及:找一个上大学xyz的学生,学习abc主语,说英语,然后......所以,我基本上打击每个表。

我有以下几层:

服务层

AppStudentService,AppCollegeService,...

业务逻辑层(BLL),其中包含以下域模型:

学生,学院,科目,语言,SearchService ......

数据访问层(DAL),其中包含以下存储库:

StudentRepository,CollegeRepository,SubjectRepository,LanguageRepository

为了解决这个问题,我在服务层构建了一个AppSearchService。这将实例化BLL中的SearchService以及DAL中的所有必需存储库。

在BLL中,我构建了一个包含搜索逻辑的SearchService,并在每个存储库上调用SubSearch()方法来获取其区域的数据,例如: StudentRepository.SubSearch返回学生的详细信息。业务逻辑将所有子搜索结果捆绑在一起,以便返回最终的搜索结果。

我决定将搜索分解为许多小查询,即SubSearch方法,而不是包含许多连接的大量搜索查询。使用实体框架。

问题1。

每个存储库都有它的标准方法,例如添加,保存,删除,FindAll,FindBy和SubSearch方法。在这里添加我的自定义(非repo)方法是个好主意,还是会污染存储库设计?

问题2。

最好将所有SubSearch方法和搜索逻辑放在DAL中的新Search类(和方法)中吗?这样所有逻辑都在一起,不需要实例化所有BLL对象和Repo对象,即更好的性能。

问题3。

我是否已经为存储库模式做了一个很好的方法?如果没有,有人可以指出我正确的方向,谢谢。

2 个答案:

答案 0 :(得分:1)

当谈到问题一问题三时。这是我的存储库:

public interface IRepository<T>
{
    IQueryable<T> List();
    bool Create(T item);
    bool Delete(int id);
    T Get(int id);
}

就是这样。存储库用于基本访问,仅用于涵盖不同数据库访问库中这些功能的实现。它是具有通用实现的泛型类。

关于问题二。我不确定你的意思,但我会用方法IStudentSearchService创建Search,它接受​​标准对象。它将使用存储库(在构造函数中注入)。您只注入搜索功能使用的存储库。它注入了多少它们,创建存储库应该花费很多而且不应该进行数据库操作。此服务可以有许多私有方法来准备用于搜索的其他数据。

答案 1 :(得分:1)

您最好创建一个SearchRepository,用于搜索整个数据层。这将是最有效的,因为将多个存储库的结果连接在一起将是丑陋的,并且效率最低。最糟糕的噩梦。

如果您不需要,您不希望为搜索执行多个查询。您应该将查询作为单个单元执行。这是最有效的。