问题标签 [domain-driven-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
3233 浏览

singleton - DDD 存储库作为单例?

快速提问:将我的领域驱动设计风格存储库实现为单例是个好主意还是坏主意?为什么?

或者我应该使用依赖注入器容器来管理我的存储库并确定它们是否是单例?

我仍在快速阅读 DDD,并希望看到一些好的存储库示例。

0 投票
1 回答
826 浏览

c# - 这种映射可以用(流利的)NHibernate 完成吗?

我有一个事件表,其目标是存储网站用户所做的操作。一个动作基本上改变或在表 X 中创建一个新行。这将允许我存储用户完成的所有动作的历史记录。因此,事件包含:

  • 主键列
  • 描述事件的文本(例如:“发表评论”)
  • 如果需要,一个鉴别器列
  • 另一个表 A 的外键列
  • 另一个表 B 的外键列
  • ……
  • 另一个表的外键列 N

Events 表中的一行将只设置一个外键列,所有其他列都将为空(因此它们都可以为空)。该表的行为类似于事件所涉及的实际表的间接表。我不知道是否需要鉴别器,因为所有信息都包含在外键列中。表 A 到 N 可以是任何东西。如果需要,它们的域模型类可以有一个公共接口(IEventRecordable)。

我的问题是:Events 表和 Event 类之间是否可以映射?使用流利的 nhibernate 是否特别可行?可以不用创建很多 Event 的派生类(我不想创建那么多空的子类)就可以做到吗?理想情况下,Event 类如下所示:

领域模型类中的很多类都可以实现 IEventRecordable(主要是一个空接口)。它可以是 User 表或 BlogComment 表...

谢谢

0 投票
1 回答
8616 浏览

c# - 具有类层次结构的 NHibernate 映射,其基类是抽象的,鉴别器不是字符串

以下是域模型类:

请注意,父类是抽象的,当需要使用流利的 nhibernate 进行映射时,这给了我一些困难。我的鉴别器是一个字节(数据库中的tinyint)。因为它不是字符串,我无法在基类上设置鉴别器值,所以这不起作用(取自 BaseClass 的映射类):

我得到的错误信息是:

类初始化方法 UnitTest1.MyClassInitialize 抛出异常。NHibernate.MappingException:NHibernate.MappingException:无法将鉴别器值格式化为实体 BaseClass 的 SQL 字符串 ---> System.FormatException:输入字符串的格式不正确..

以下帖子似乎解释了会发生什么。他们用 xml 提供了一个解决方案,但没有用流利的 nhibernate: http: //forum.hibernate.org/viewtopic.php? t=974225

谢谢您的帮助。

0 投票
3 回答
2625 浏览

asp.net - 如何将 GridView 绑定到多种类型的列表?

我收到此错误:

System.Reflection.TargetException:对象与目标类型不匹配。

当尝试绑定List<IEvent>IEvent 可以是约会、生日或其他一些与日历相关的事件类型时。

0 投票
4 回答
472 浏览

code-generation - 哪些 .NET 框架允许您首先创建业务实体,然后是数据库

是否有任何 .NET 框架允许您先创建业务实体,然后再创建数据库。换句话说,允许您稍后使用 DDD / Persistence Ignorance 方法备份到数据库中。允许您编写的模型/类生成 SQL DDL 和迁移脚本的任何工具。

随意修改我的措辞,并使其成为一个更好的问题。

0 投票
6 回答
6208 浏览

c# - 如何设计具有复杂初始化的不可变对象

我正在学习 DDD,并且遇到了“价值对象”应该是不可变的声明。我了解这意味着对象状态在创建后不应更改。这对我来说是一种新的思维方式,但在很多情况下都是有意义的。

好的,所以我开始创建不可变的值对象。

  • 我确保他们将整个状态作为构造函数的参数,
  • 我不添加属性设置器,
  • 并确保不允许任何方法修改内容(仅返回新实例)。

但现在我想创建这个包含 8 个不同数值的值对象。如果我创建一个有 8 个数字参数的构造函数,我觉得它不会很容易使用,或者更确切地说 - 在传递数字时很容易出错。这不可能是好的设计。

所以问题是:是否有任何其他方法可以使我的不可变对象变得更好.. 可以在 C# 中完成任何魔术来克服构造函数中的长参数列表?我很想听听你的想法。。

更新:在任何人提到它之前,这里已经讨论了一个想法: C# 中的不可变对象模式 - 你怎么看?

不过,有兴趣听到其他建议或意见。

0 投票
1 回答
354 浏览

domain-driven-design - 领域驱动设计与仅使用规范有何不同?

我读到域驱动设计是关于专注于问题域而不是专注于软件。他们说解决问题领域的复杂性比解决软件的复杂性更容易,因为在解决了领域之后,您也更了解如何构建软件。他们还说,实际上域比软件的结构更复杂,或者如果你从树林里看不到森林,你就有麻烦了。

但是领域驱动设计与仅使用软件规范有何不同?我的意思是,我们当然应该在开始编码之前了解问题域。DDD 是在重新发明轮子吗?

0 投票
2 回答
275 浏览

asp.net-mvc - 添加不是聚合根的实体的首选 URL 是什么?

示例:Order 对象(聚合根)具有 OrderLine 对象(子实体)的集合。将 OrderLine 添加到订单的 URL 是什么?考虑使用聚合根的控制器和为子实体使用单独的控制器之间的区别。

1:http ://example.com/orders/add-orderline?order-id=42&product-id=12&quantity=2

或者

2:http ://example.com/order-lines/add?order-id=42&product-id=12&quantity=2

谢谢!

0 投票
4 回答
410 浏览

c# - 何时将某些实体分成不同的存储库?

我通常会尝试将所有相关实体保存在同一个存储库中。以下是两者之间有关系的实体(标有缩进):

  • 用户
    • 用户偏好

因此,进入用户存储库是有意义的。但是,用户通常与许多不同的实体相关联,在下面的示例中您会怎么做?

  • 用户

    • 用户偏好
    • 命令
  • 命令

    • 产品

订单与产品和用户都有关系,但您不会将所有 4 个实体的功能都放在同一个存储库中。当您与用户实体打交道并收集订单信息时,您会做什么?您可能需要有关产品的额外信息,并且 ORM 通常会提供延迟加载的能力。但是,如果您的产品实体与用户实体位于单独的存储库中,那么这肯定会导致存储库之间发生冲突吗?

0 投票
1 回答
154 浏览

orm - 实体和计算属性

实施以下内容的最佳做法是什么:

  1. 我们有一个班级OrderOrderItem作为亲子。
  2. OrderItem提供属性Cost
  3. 在 OrdersList 表单上,我们必须看到 MaxCostcolumn = max(cost) from Itemscollection

我在这里只找到了一个不会破坏 DDD 概念的有用解决方案:向MaxCost类添加常用属性Order并在每次项目列表更新时更新它。

还有其他方法吗?