【问题标题】:MVC Search functionality using repository pattern使用存储库模式的 MVC 搜索功能
【发布时间】:2014-09-11 03:25:15
【问题描述】:

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

我四处搜索,没有找到任何符合存储库模式的东西。我已经快速阅读了规范方法,但这看起来并不符合我的要求。请继续阅读。

典型的搜索包括:找一个上过 xyz 大学的学生,学习 abc 科目,会说英语,而且...所以,我基本上是在每张桌子上打。

我有以下几层:

服务层

AppStudentService, AppCollegeService, ...

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

学生、大学、学科、语言、SearchService ...

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

StudentRepository、CollegeRepository、SubjectRepository、LanguageRepository

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

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

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

问题 1。

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

问题 2。

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

问题 3。

我为存储库模式所做的事情是一种好方法吗?如果没有,谁能指出我正确的方向,谢谢。

【问题讨论】:

    标签: asp.net-mvc repository-pattern


    【解决方案1】:

    您最好创建一个 SearchRepository,用于在您的数据层中进行搜索。这将是最有效的,因为将多个存储库的结果连接在一起会很丑陋,而且充其量也是低效的。一场噩梦,在最坏的情况下维持。

    您不希望在不必要的情况下对搜索执行多个查询。您应该将查询作为一个单元执行。这是最有效的。

    【讨论】:

      【解决方案2】:

      关于问题一和问题三。这是我的存储库:

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

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

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

      【讨论】:

      • 仅供参考 - 通用存储库被视为反模式 ben-morris.com/… planetgeek.ch/2012/05/05/… 等。
      • @ErikFunkenbusch:这与 Ben Morris 所写的类似。前面不使用,服务类中使用。 “通用存储库确实有一个位置,但作为一个助手而不是合同。诀窍不是公开通用接口,而是通过组合实现重用。” - 我们将它用作服务类的助手。存储库不是也不应该对控制器可见。
      • 不,他的意思是它们永远不应该暴露给任何东西,甚至不应该暴露给服务类。它们应该只被用作基于它们创建具体存储库的组合,因为它们是泄漏的抽象。即,通用接口永远不应该暴露在存储库层之外。
      猜你喜欢
      • 1970-01-01
      • 2011-04-19
      • 2021-10-10
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多