我正在尝试使用存储库模式,域模型和服务层在应用程序中构建一个简单的搜索功能。
我一直在搜索并找不到任何适合存储库模式的内容。我已经快速阅读了规范方法,但看起来它不符合我的要求。请继续阅读。
一个典型的搜索将涉及:找一个上大学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。
我是否已经为存储库模式做了一个很好的方法?如果没有,有人可以指出我正确的方向,谢谢。
答案 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,用于搜索整个数据层。这将是最有效的,因为将多个存储库的结果连接在一起将是丑陋的,并且效率最低。最糟糕的噩梦。
如果您不需要,您不希望为搜索执行多个查询。您应该将查询作为单个单元执行。这是最有效的。