使用 LINQ 的多个或单个存储库

2023-11-21

我一直在阅读 Professional ASP.NET MVC 1.0 书中的第 11 章(可测试设计模式)。在本章的示例中,数据访问被分为多个存储库:IOrderRepository、IProductRepository 等。这一切都有意义:单个数据类的单个存储库。

然而,当您考虑表之间的链接时,这对我来说有点不合理:一个订单包含许多产品。当 LINQ-to-SQL 创建 Order 类时,该订单类将具有一个 Products 集合,该集合枚举与该订单相关的所有产品。因此,通过使用这个集合,我们绕过了 ProductsRepository。

因此,在模拟时,我不仅要模拟 OrderRepository 和 ProductRepository,还必须在返回的 Order 对象中填充 Products 集合。这意味着模拟的 OrderRepository 必须了解模拟的 ProductsRepository 等等。

忽略 LINQ 为我精心创建的这些集合似乎是一种浪费,所以我的问题是,在这种情况下,单个存储库不是更有意义吗?


您的问题描述是一个典型的教科书示例,过多的关于“这很好,那很糟糕”的废话成为开发人员按照其创建方式创建软件而不是查看手头的问题并创建软件来解决该问题的原因。

举个例子:您的问题描述并不是您要解决的问题:您要为您的客户创建一个应用程序,这才是您应该解决的问题。如果您选择的工具让您的生活变得困难,请将它们踢出并使用有效的工具:如果模拟不起作用,为什么还要麻烦呢?哦,因为有人说如果你不嘲笑你的软件就会很糟糕?为什么?

您到处学习了一些 DDD 的东西,但是您错过了一些重要的部分: 产品是一个聚合根。这意味着您应该从其自己的存储库获取产品。是的,这会减轻模型中的导航功能,但如果您严格按照 Evans 书的第二部分的规定创建存储库,那么这对您来说就是 DDD。但是……你应该吗?

如果您无法回答为什么 Product 有自己的存储库,但您可以从 Order 导航到产品,则不应为聚合根创建存储库。为什么那个存储库在那里?如果它在那里,它不应该是获得产品的唯一地点吗? (所以也不是通过延迟加载!)。

这确实会产生大量开销和您可能不需要的代码(讽刺的是,YAGNI 完全有效)。

好了,吐槽够了。 DDD 的意义在于thinking。因此,领域应该驱动设计,通过实践,您将获得代表现实的领域模型。这并不是说您应该仅仅因为您在应该阅读的地方阅读而实现大量代码。相反,如果您已经识别了域元素、聚合根等,那么您必须将这些类型的行为放置在某个地方,例如在域类内部。您可以将获取逻辑放置在单独的类中,例如订单存储库中的面向订单的获取逻辑,但它不会是严格意义上的存储库(例如,它没有自己的本地缓存等)。这并没有那么糟糕,重要的是你应该为你的客户创造什么。

所以,第一:思考,第二:思考,第三:再思考一次。对你来说似乎合乎逻辑的事情。列出您拥有的选项的优缺点,然后选择最适合您的选项。记录这一选择以及您选择该选择而不是其他选择的原因。这为维护者提供了比任何其他来源更多的价值:您记录了替代方案以及为什么不选择它们,您研究了对您有用的方法,然后选择了一个。

软件工程并不难,只是现在似乎很流行先做后想,没有适当的推理why人们会那样做,而不是另一种方式。

祝你好运 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 LINQ 的多个或单个存储库 的相关文章

  • MVC 中的 Blazor:组件被渲染,但 @onclick 不起作用。连接问题

    我正在尝试在 net core 3 MVC 项目中使用 Blazor 我使用了一些教程来做到这一点 例如https fizzylogic nl 2019 08 18 integrating blazor in an existing asp
  • 如何使用 EF Code First 解释枚举类型

    这是一个模型 Public class Person Key Public int PersonId get set Public int Age get set Public ColorEnum FavoriteColor get set
  • ASP.NET MVC:FileStreamResult 返回太多字节?

    我正在调用 MVC 控制器方法 返回类型是FileStreamResult 在此方法中 我以字节数组的形式创建图像 我正在创建一个 MemoryStream 在构造函数中传递字节数组 然后 我在构造函数中返回一个新的 FileStreamR
  • ASP.NET MVC - 更新生产中的预编译 Razor View 文件

    我想知道以下是否可能 通过在 Visual Studio 中打开项目设置 使用我们的 MVC 应用程序预编译 Razor 视图 将应用程序部署到生产环境 然后在稍后阶段 通过覆盖生产中现有的 cshtml 文件来更新视图 而无需回收应用程序
  • 如何在MVC中获取控制器中的下拉值

    我使用递归函数使用字符串列表绑定下拉列表我的下拉菜单具有类似的值 家 首页 gt gt 厨房 首页 gt gt 厨房 gt gt ABC 我想在数据库中使用相同的下拉值 ABC 这是我的查看代码 ViewBag Title Createne
  • T4MVC Base 控制器没有默认构造函数

    我的控制器是从另一个没有默认构造函数的控制器继承的 T4MVC 生成以下构造函数 假设基本控制器具有默认构造函数 protected MyControllerController Dummy d 我该如何解决这个问题 有趣的是 根据this
  • 在 Linq 查询中使用动态列名称

    foreach Dimension dimensions in Enum GetValues typeof Dimension var r new ReferenceTable dimensions referenceItems List
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • 使用 LINQ 获取两个数组中不同和共同的项目

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 例如 我有
  • 如何在VS2010中获取T4来迭代类的属性

    我使用的是 Visual Studio 2010 并且安装了有形的 T4EditorPlusModellingTools 我只是在玩T4 以前从未接触过它 我想做的是查看项目中的一个类 并写出每个属性 谁能给我关于如何构建 tt 文件的绝对
  • SingleOrDefault异常处理

    我有一个示例代码 它调用 SingleOrDefault 方法 3 次 并在任何序列具有多个匹配元素时记录异常 如果我想检查这段代码的哪一部分抛出异常 问题就开始了 是否可以从此异常中获取一些有用的信息 例如谓词参数或集合类型以进行更详细的
  • 如何直接在 Razor 中从 ASP.NET Identity 获取 UserId() 方法

    我的某些部分的自定义授权存在此问题Views 我不想穿上PartialView 而不是我使用If声明如下 if item CurrentComment Id Guid Parse ViewBag UserId repository IsUs
  • MVC4 输入字段占位符

    Does MVC4默认支持placeholders对于生成的输入字段 我没有找到任何东西 所以我正在尝试实现我自己的 但不幸的是Prompt E Mail 没有传递到ViewData ModelMetadata Watermark同时产生控
  • 在 ASP.NET MVC 中设置默认 JSON 序列化器

    我正在开发一个已部分转换为 MVC 的现有应用程序 每当控制器响应 JSON ActionResult 时 枚举都会以数字形式发送 而不是字符串名称 听起来默认的序列化程序应该是 JSON Net 它应该将枚举作为其名称而不是整数表示形式发
  • 向客户报告模型状态和应用程序错误的推荐方法是什么?

    我想知道向浏览器报告将显示给用户的应用程序或模型状态错误的最佳实践是什么 你能抛出一个异常并在jquery post的错误处理程序中处理它吗 例如 考虑这个方法 HandlerErrorWithAjaxFilter HttpPost pub
  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 如何在 Asp.NET MVC 中使用 RedirectToAction() 传递多个对象?

    我想使用redirectToAction 方法传递多个对象 下面是我重定向到的操作结果 public ActionResult GetEmployees Models Department department Models Categor
  • 您如何填充/验证您的 ViewModel?

    我很好奇人们构建 ViewModel 的各种方式以及他们为什么选择该方法 我在这里可以想到几种方法 1 注入存储库 控制器加载模型并映射到 ViewModel 这里 ViewModel 构造函数可以采用各种集合来进行内部设置 在选择列表中
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c

随机推荐