DDD:更新实体多个属性的指南

2023-12-31

所以,我决定学习 DDD,因为它似乎可以解决我一直面临的一些架构问题。虽然有很多视频和示例博客,但我还没有遇到可以指导我解决以下场景的视频和示例博客:

假设我有实体

public class EventOrganizer : IEntity
{
    public Guid Id { get; }

    public string Name { get; }

    public PhoneNumber PrimaryPhone { get; }

    public PhoneNumber AlternatePhone { get; private set; }

    public Email Email { get; private set; }

    public EventOrganizer(string name, PhoneNumber primaryPhoneNr)
    {
        #region validations

        if (primaryPhoneNr == null) throw new ArgumentNullException(nameof(primaryPhoneNr));

        //validates minimum length, nullity and special characters
        Validator.AsPersonName(name);

        #endregion

        Id = new Guid();
        Name = name;
        PrimaryPhone = primaryPhoneNr;
    }
}    

我的问题是:假设这将被转换并馈送到 MVC 视图,并且用户想要更新 AlternatePhone、电子邮件和许多其他属性,这些属性对于给定的有界上下文存在于该实体中(为简洁起见,未显示) )

我知道正确的指导是为每个操作都有一个方法,但是(而且我知道它有点反模式)我忍不住想知道这是否最终会触发数据库上的多个更新调用。

这是怎么处理的?在接下来的某个地方,是否会有一些东西将我的 EventOrganizer 映射到某些东西 - 比如 DbEventOrganizer 并收集对域实体所做的所有更改并一次性应用这些更改?


DDD 更适合基于任务的 UI。你所描述的非常面向CRUD。在您的情况下,各个属性被视为独立的数据字段,其中一个或多个属性可以通过单个通用业务操作(更新)进行更新。

如果您想成功使用 DDD,则必须对您的领域进行更深入的分析。

为什么有人会一起更新所有这些字段?用户试图通过这样做来实现什么隐式业务操作?有没有更具体的业务流程,通过改变来表达PrimaryPhone, AlternatePhone and Email一起?

也许这正在改变ContactInformation of an EventOrganizer?如果是这种情况,那么您可以建模一个ChangeContactInformation操作于EventOrganizer。然后你的 UI 会发送一个ChangeContactInformation命令而不是update命令。

至于聚合根 (AR) 的持久性,如果您使用的是 RDBMS,则通常由像 NHibernate 这样的 ORM 来处理。但是,还有其他方法可以持久保存 AR,例如事件源、NoSQL DB,甚至存储 JSON https://vaughnvernon.co/?p=942或 RDBMS 中的任何其他数据交换格式。

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

DDD:更新实体多个属性的指南 的相关文章

  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 导入不适用于 tsconfig.json 中的 "module": "ESNEXT"

    我在服务器端有以下代码 import as express from express export class AppRouter private static instance express Router static getInsta
  • Flexbox 换行 - 最后一行的不同对齐方式

    我使用弹性框将两个项目与容器的左侧和右侧对齐 同时将它们垂直居中对齐 这是我想要实现的目标的一个非常简单的例子 HTML div class container div class first div div class second di
  • 如何判断 Delphi 应用程序是否“拥有”其控制台?

    Delphi 控制台应用程序可以从现有控制台窗口的命令行运行 并且可以通过双击其图标来运行 在后一种情况下 它将创建自己的控制台窗口 并在应用程序终止后将其关闭 如何判断我的控制台应用程序是否已创建自己的窗口 我想检测到这一点 以便我可以显
  • 使用 matplotlib + errorbar 进行动画

    我正在尝试根据这个例子制作动画 我的主要问题是我不知道如何将动画与错误栏连接起来 也许有人已经解决了 相似的东西 import numpy as np import matplotlib pyplot as plt import matpl
  • 将行分隔的 grep 结果放入数组中

    我有以下 grep 命令 echo v1 33 4 egrep o 0 9 1 3 返回 1 33 4 在 Bash 脚本中 我想将这些行分隔成一个数组 我尝试将它直接分配给一个变量并对其运行 for 循环 但循环内的回声仅产生第一个数字1
  • Eclipse 不允许从另一个工作区访问外部 jar 中的静态接口方法

    有两个 Eclipse 工作区 工作区A and 工作区B In 工作区A 有一个项目 其接口定义了公共静态方法 package workspacea public interface Foo public static String sa
  • 将自定义搜索字段添加到 DataTable 对象

    我需要将在页面上创建的字段添加到 DataTable 对象 尽管它们不是典型的参数 顺序 搜索 分页等 但它们可以与 DataTables 对象状态的其余部分一起保存和加载 JavaScript document ready functio
  • Android 设备选择器窗口目标栏中的橙色三角形是什么意思?

    当我使用 Eclipse 启动 Android 应用程序时 会出现通常的窗口 Android Device Chooser 我可以在这里选择要在哪个设备上运行我的应用程序 在目标列中 我的目标旁边会出现一个带有感叹号的橙色三角形 有点 警告
  • Numpy:从给定范围生成组合的有效方法

    我有一个 n 维数组 如下所示 np array 0 3 0 3 0 10 在此数组中 元素表示低值和高值 前任 0 3 指的是 0 1 2 3 我需要使用上面给出的范围生成所有值的组合 例如 我想要 0 0 0 0 0 1 0 1 0 3
  • 重新编码数值向量 R

    我有一个数字向量 让我们这样说 x lt rep 1 6 300 我想做的是重新编码向量 使 6 1 5 2 4 3 3 4 2 5 1 6 我不想从中创造一个因素 到目前为止 我尝试过的所有操作都因为顺序而给出了错误的计数 即 x x 6
  • Haskell 中一元运算符的前缀形式

    In GHCi 前奏 gt 3 2 5 前奏 gt 3 2 6 前奏 gt 3 20 66666666666666666 前奏 gt 3 2没有 Num t gt t1 的实例由字面意思产生的3 at
  • 使用 FILTERXML 将字符串解析为表

    这与此有关question https stackoverflow com questions 69045317 how to calculate backplane throughput given an arbitrary list o
  • 数组的 setter 和 getter

    我是 Java 新手 我需要一些澄清如何解决问题 我有课Epicycle 定义如下 public class Ts epicycle private double epoch private double tle new double 10
  • xmpphp XMPP,从 php 脚本发送消息

    你好 我有一个 jabberserver 我希望能够从 php 脚本向用户推送消息 F x 如果我从浏览器调用 script php 它会向用户发送一条消息 我已经尝试过 jaxl 和 xmpphp 这两个 xmp 框架 但我无法让它工作
  • Angular2 beta:嵌套基于表单的父/子组件并从父级进行验证

    我正在尝试在 Angular2 Plunker 中带有 TS 的 beta 0 中实现一个具有 2 个嵌套表单的场景 每个表单由一个组件表示 父组件是Word 它代表假字典中的单词 子组件是WordSense s 每个都代表父词的一种含义
  • 使用 SmtpClient 时“操作超时”

    我正在尝试使用 C 框架创建一个小应用程序来发送电子邮件 然而 它不起作用 该应用程序总是给我 操作超时 我不知道为什么 这是我的代码 private void button1 Click object sender EventArgs e
  • 在 PostGIS 中,大于半个世界的多边形被视为相反的多边形

    我将 GeoDjango 与 PostGIS 结合使用 并尝试使用多边形从数据库中获取属于其中的记录 如果我定义一个大于地球面积一半的多边形 则假定多边形的 内部 是我打算作为 外部 的较小区域 并且仅返回其外部的结果 我可以使用这个较小的
  • 使用 CSS Flex 使行中的元素等高

    我试图使用黄色背景的元素与该行中的其他元素具有相同的高度flex 但无法通过这种设计弄清楚 这li元素只是不想处于全高 运行代码片段看看我在说什么 谢谢你 html body height 100 margin 0 padding 0 ma
  • 如何超越这个正则表达式替代品?

    经过大量测量后 我在我们的一项 Windows 服务中发现了一个我想要优化的热点 我们正在处理可能包含多个连续空格的字符串 并且我们希望减少到仅单个空格 我们使用静态编译的正则表达式来完成此任务 private static readonl
  • DDD:更新实体多个属性的指南

    所以 我决定学习 DDD 因为它似乎可以解决我一直面临的一些架构问题 虽然有很多视频和示例博客 但我还没有遇到可以指导我解决以下场景的视频和示例博客 假设我有实体 public class EventOrganizer IEntity pu