c# - 使用存储库模式加入 DbSet

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

我有通用的存储库模式的基本实现 IRepository<T>其中包含 Add , Remove , Find等,我有更精确的存储库,例如 IActorRepositoryIFilmRepository源自 IRepository .我有一个搜索框方法,可以找到与搜索框中的文本匹配的前 5 个 Actor 和电影。

我的问题是如何将它们加入存储库?我需要我的方法是可测试的,所以我不想要 IQueryable在我的方法中,只是一个我可以稍后模拟的接口(interface)。

我唯一想到的是创建某种辅助类,例如 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);
}

另外,因为我有 ToList()我怀疑它会从数据库中提取所有内容,对吧?

最佳答案

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

服务应该封装和暴露业务逻辑。因此,如果您想返回基于 Actor 的电影列表,那么您可以使用类似 Task<List<Film>> GetFilmsForActorAsync(string actor) 的方法。那会那样做。不要试图将每个实体包装在其自己的服务中,这样您就没有添加任何真正有值(value)的东西。

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

关于c# - 使用存储库模式加入 DbSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45695482/

相关文章:

c# - 删除动态定时器

jquery - $.getJSON 不调用 "successful"函数

c# - 你在 C# 中使用 "this"运算符吗?

c# - 如何终止 session 或 session ID (ASP.NET/C#)

javascript - 使用 jQuery 从中间到顶部为多个元素设置动画

asp.net - 从 jQuery 触发服务器端事件 - __EVENTARGUMENT 不存在

c# - ASP.NET 应用程序的高内存使用率

javascript - 下拉列表值的更改不会将更新后的值返回到 Controller

asp.net - 安装 Visual Studio Express 2010

c# - 如何从页面访问文本框值到用户控件