【发布时间】:2021-12-22 21:30:46
【问题描述】:
目前我正在学习 DDD 和 CQRS 方法。我开始了一个与餐厅领域相关的项目。
我发现(使用事件风暴)的模块之一是菜单。在菜单模块中,餐厅经理可以存储多个菜单。 Menu 是 AggregateRoot,它在菜单中的组和连接项(位置)之间强制执行规则。
有问题的规则:
- 餐厅中的一个菜单可以同时激活。
- 菜单的内部名称在餐厅内必须是唯一的。
为了执行这些规则,我尝试将餐厅存储库接口传递给菜单(我更关注 1. 规则,因为 2. 更难)。我觉得我做错了什么。我有一个使用域服务来强制执行的想法,经过分析,我认为它不会更好。你对我有什么建议吗?谢谢你:)
public class Menu : AggregateRoot<MenuId>
{
public string InternalName { get; private set; }
public RestaurantId RestaurantId { get; private set; }
public IReadOnlyList<Group> Groups => _groups;
private List<Group> _groups = new();
...
internal void Activate()
{
CheckRule(new ActiveMenuMustHaveAtLeastOneGroup(_groups));
_groups.ForEach(x => x.CheckConsistency());
}
public void ChangeInternalName(string newInternalName, IRestaurantRepository
restaurantRepository)
{
CheckRule(new InternalNameMustBeUniqueInRestaurantMenusRule(RestaurantId,
newInternalName, restaurantRepository));
InternalName = newInternalName;
}
}
public class Restaurant : AggregateRoot<RestaurantId>
{
public MenuId ActiveMenuId { get; private set; }
public IReadOnlyList<MenuId> MenuIds => _menuIds;
private List<MenuId> _menuIds = new();
...
public void ChangeActiveMenu(MenuId newActiveMenuId, IMenuRepository menuRepository)
{
CheckMenuExists(newActiveMenuId);
CheckRule(new CannotActivateActiveMenuRule(ActiveMenuId, newActiveMenuId));
var menu = menuRepository.GetAsync(newActiveMenuId).Result;
menu.Activate();
ActiveMenuId = newActiveMenuId;
}
...
}
【问题讨论】:
标签: c# .net domain-driven-design cqrs clean-architecture