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



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

我搜索了一下,没有找到任何符合存储库模式的东西。我已经快速阅读了Specification方法,但它看起来不适合我的要求。请继续读下去。

一个典型的搜索将包括:找到一个学生就读于某某大学,学习科目abc,说英语,和…因此,我要点击每个表格。

我有以下图层:

服务层

AppStudentService, AppCollegeService,…

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

学生,学院,学科,语言,搜索服务…

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

studenterepository, CollegeRepository, subjecerepository, LanguageRepository

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

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

我决定将搜索分解成一些小查询,即子搜索方法,而不是包含许多连接的大规模搜索查询。使用实体框架。

1 .

问题

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

2 .

问题

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

3 .

问题

我所做的是存储库模式的好方法吗?如果没有,谁能告诉我正确的方向,谢谢。

最好创建一个SearchRepository,它用于跨数据层进行搜索。这将是最有效的,因为将多个存储库的结果连接在一起将是丑陋的,而且效率低下。在最坏的情况下,这是一场噩梦。

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

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

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

就这些。Repository用于基本访问,仅用于涵盖这些函数在不同数据库访问库中的实现。它是泛型类,具有泛型实现。

关于问题二。我不知道你是什么意思,但我会用方法Search创建IStudentSearchService,这需要标准对象。它将使用存储库(注入构造函数中)。只注入搜索功能使用的存储库。无论您注入了多少个,创建存储库应该花费很多,并且不应该进行数据库操作。此服务可以有许多私有方法来准备用于搜索的附加数据。

最新更新