我试图使用存储库模式、域模型和服务层将一个简单的搜索功能构建到应用程序中。
我到处搜索,没有发现任何符合存储库模式的东西。我对Specification进行了快速阅读,但这看起来不符合我的要求。请继续读。
一个典型的搜索包括:找到一个上大学的学生,学习abc,讲英语,和.所以,我基本上是在敲每一张桌子。
我有以下几层:
服务层
AppStudentService,AppCollegeService,。
业务逻辑层(BLL),包含以下域模型:
学生,学院,学科,语言,SearchService .
数据访问层(DAL),包含以下存储库:
StudentRepository,CollegeRepository,SubjectRepository,LanguageRepository
为了解决这个问题,我在服务层构建了一个AppSearchService。这将在BLL中实例化SearchService,在DAL中实例化所有所需的存储库。
在BLL中,我构建了一个包含搜索逻辑的SearchService,并在每个存储库上调用一个SubSearch()方法来获取它所在区域的数据,例如StudentRepository.SubSearch返回学生的详细信息。业务逻辑将将所有子搜索结果绑定在一起,以便返回最终的搜索结果。
我决定将搜索分解为多个小查询,即SubSearch方法,而不是包含许多联接的大规模搜索查询。使用实体框架。
问题1.
每个存储库都有它的标准方法,例如Add、Save、Remove、FindAll、FindBy和SubSearch方法。在这里添加我的自定义(非回购)方法是个好主意,还是它污染了存储库的设计?
问题2.
是否更好地将所有SubSearch方法和搜索逻辑放在DAL中的一个新的搜索类(和方法)中?这样,所有的逻辑都在一起,不需要实例化所有BLL对象和Repo对象,即更好的性能。
问题3.
对于存储库模式,我所做的是一个很好的方法吗?如果没有人能为我指明正确的方向,谢谢。
发布于 2014-07-20 20:26:46
您最好创建一个SearchRepository,用于跨数据层进行搜索。这将是最有效的,因为将多个存储库的结果连接在一起将是丑陋的,最好是低效的。最坏的恶梦。
如果没有必要的话,您不希望执行多个搜索查询。您应该将查询作为一个单元执行。这是最有效的。
发布于 2014-07-20 20:02:17
说到,问题一,和问题三,。这是我的存储库:
public interface IRepository<T>
{
IQueryable<T> List();
bool Create(T item);
bool Delete(int id);
T Get(int id);
}这就是全部。存储库用于基本访问,仅用于覆盖不同数据库访问库中这些函数的实现。它是具有泛型实现的泛型类。
关于问题二,。我不知道您的意思是什么,但是我会用方法IStudentSearchService创建Search,这是一个条件对象。它将使用存储库(在构造函数中注入)。您只注入搜索功能使用的存储库。甚至不管您注入了多少存储库,创建存储库的成本都应该很高,而且不应该进行数据库操作。此服务可以有许多私有方法来准备用于搜索的其他数据。
https://stackoverflow.com/questions/24851276
复制相似问题