gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:38:45 25 4
gpt4 key购买 nike

我有通用的存储库模式的基本实现 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com