我正在尝试使用存储库模式、领域模型和服务层在应用程序中构建一个简单的搜索功能。
我搜索了一下,没有找到任何符合存储库模式的东西。我已经快速阅读了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
,这需要标准对象。它将使用存储库(注入构造函数中)。只注入搜索功能使用的存储库。无论您注入了多少个,创建存储库应该花费很多,并且不应该进行数据库操作。此服务可以有许多私有方法来准备用于搜索的附加数据。