我想使用域驱动的设计策略模式,使用MongoDb作为聚合的存储引擎。
为了确保对象封装,并降低我的模型与基础结构层的“阻抗不匹配”:我需要提供内部作用域构造函数(用于仅从域事件在域层中创建内部对象),并为额外域层对象创建提供公共工厂。
示例
// Aggregate
public class FlashInfo : AggregateRoot<FlashInfoId>
{
public Information Text { get; private set; } // => see the problem with this VO
public DateTim
我正试图思考如何在两个聚合体之间维护id引用,例如。当任何一方发生影响关系的事件时,另一方也会以最终一致的方式进行更新。
我有两个聚合体,一个用于"Team“,一个用于"Event",在节日上下文中,代码如下:
@Aggregate
public class Event {
@AggregateIdentifier
private EventId eventId;
private Set<TeamId> teams; // List of associated teams
... protected constructor, get
为了学习目的,我尝试用一些DDD原则构建rest。看了很多书后,有些事情对我来说不太清楚。
在提出问题之前,我将展示域模型和一个示例用例。
域模型
TagAR
- id
- workspace_id // Reference to WorkspaceAR
- name
WorkspaceAR
- id
- name
- tags // List of Tag ids. Reference to TagAR
ProjectAR
- id
- workspace_id // Reference to WorkspaceAR
- name
- description
- tags // List
我有一个管理门票和客户的应用程序。顾客有很多票。如果一个客户被删除,那么它的票也会被删除。这是检验对象是否应该是聚合的测试之一。我选择它们都应该是实体,而不是聚集根。我通常会加载和显示一张票的清单,跨越许多客户。我使用Server以关系格式保存数据。
我的架构如下:
ASP.NET MVC应用程序。
WCF服务(外观)此服务具有公共方法,如GetTicket、GetTickets、GetCustomer和GetCustomers。它直接为此使用存储库。它还有一个叫做Run的公共方法。Run接受一个命令,可以是AssignTicket、ChangeTicketName等。为了处理这些命令
我们的子域有两种主要聚合类型:Locations、和托盘。每个位置跟踪它持有多少托盘,每个托盘一次只能放在一个位置上。假设每种类型有许多实例,并且它们的关联经常发生变化,所以将它们都放在一个公共父聚合中是不可行的。
考虑这个解决方案(只显示域模型):
public class Pallet : Aggregate
{
public int LocationId { get; private set; }
public void PlaceOnLocation(int locationId)
{
this.LocationId = locationId;
this