使用存储库模式加入DbSets

时间:2017-08-15 14:52:56

标签: c# asp.net asp.net-mvc repository-pattern

我有通用IRepository<T>的存储库模式的基本实现,它包含AddRemoveFind等等。我有更精确的存储库,例如{{1来自IActorRepository的{​​}}和IFilmRepository。我有一个搜索框的方法,可以找到与搜索框中的文本匹配的前5名演员和电影。

我的问题是如何将这些加入存储库?我需要我的方法是可测试的,所以我不希望在我的方法中使用IRepository,只是我以后可以模拟的接口。

我想到的唯一一件事就是创建某种辅助类,例如IQueryable。我确定有人有这样的问题,这里的常见做法是什么,通常如何解决?

我需要解决方案的方法:

public class FilmsActorsHelper: IFilmsActorsHelper

另外,因为我有[HttpPost] public ActionResult SearchBoxChanged(string inputValue) { if (inputValue == null || inputValue.Length < 3) return Json(new List<string>()); const int maxNamesCount = 5; var names = _filmRepository.Find(f => f.Name.Contains(inputValue)).Select(f => f.Name).Take(maxNamesCount).ToList(); var remaining = maxNamesCount - names.Count; var actorNames = _actorRepository.Find(f => f.Name.Contains(inputValue)).Select(f => f.Name).Take(remaining).ToList(); names.AddRange(actorNames); return Json(names); } 我怀疑它会从数据库中提取所有内容,对吗?

1 个答案:

答案 0 :(得分:3)

不要将已经实现存储库模式(DbContext)的类型包装在您自己的存储库类型中。您正在添加一个不必要的抽象,只会使您的代码更难以阅读,您必须通过箍来做简单的事情,如连接表。创建一个具有DbContext实例的服务,然后在那里完成工作并返回结果。从Controller获取该服务。然后你可以加入任何你想要的东西。

服务应该封装和公开业务逻辑。因此,如果你想要返回一个基于演员的电影列表,那么你会有一些像Task<List<Film>> GetFilmsForActorAsync(string actor)这样的方法。不要试图将每个实体包装在自己的服务中,然后你没有添加任何真正的价值。

您还可以根据功能和读/写来拆分服务。请参阅CQRS pattern