【发布时间】:2018-03-07 13:39:40
【问题描述】:
如果这个问题不清楚,请提前道歉。请告诉我要进行哪些更改以使其成为更好的问题。
我目前正在维护一个 C# WinForm 系统,我正在尝试学习和使用 DDD 和 CQRS 原则。 Vaughn Vernon 的实施领域驱动设计 是我的主要 DDD 参考文献。
该系统当前使用利用数据感知控件的遗留代码。
在资产库存上下文中,我设计了我的聚合根Asset,它由多个值对象组成,这些值对象是系统中的标准条目:
在这种情况下,我正在尝试实现一个用户可以手动向系统注册Asset 的用例。
我当前的实现如下:
从表示层:
加载RegisterAssetForm.cs 时,它会通过数据感知控件加载Group、ItemName 等现有的标准条目列表,所有这些列表都由具有id: int 和name: string 列的数据行组成。
当用户选择所需的ItemName、Group、PropertyLevel、Department和Category,然后点击保存,执行命令:
RegisterAssetForm.cs强>
...
AssetInventoryApplicationService _assetInventoryServ;
...
void btnSave_Click(object sender, EventArgs e)
{
int itemNameId = srcItemName.Value // srcItemName is a custom control whose Value = datarow["id"]
int groupId = srcGroup.Value;
string categoryId = srcCategory.Value;
string departmentId = srcDepartment.Value;
string propLvlId = srcPropLevel.Value;
...
RegisterAssetCommand cmd = new RegisterAssetCommand(itemNameId, groupId, categoryId, departmentId, propLvlId);
_assetInventoryServ.RegisterAsset(cmd);
...
}
从应用层:
AssetInventoryApplicationService 依赖于域服务。
AssetInventoryApplicationService.cs
...
IAssetRepository _assetRepo;
...
public void RegisterAsset(RegisterAssetCommand cmd)
{
...
AssetFactory factory = new AssetFactory();
AssetID newId = _assetRepo.NextId();
Asset asset = factory.CreateAsset(newId, cmd.ItemNameId, cmd.PropertyLevelId,
cmd.GroupId, cmd.CategoryId, cmd.DepartmentId);
_assetRepo.Save(asset);
...
}
从域层:
AssetFactory.cs //不是我的最终实现
...
public class AssetFactory
{
...
public Asset CreateAsset(AssetID id, int itemNameId, int propLvlId, int groupId, int categoryId, int departmentId)
{
ItemName itemName = new ItemName(itemNameId);
PropertyLevel propLvl = new PropertyLevel(propLvlNameId);
Group group = new Group(groupNameId);
Category category = new Category(categoryNameId);
Department department = new Department(departmentNameId);
return new Asset(id, itemName, propLvl, group, category, deparment);
}
...
}
填充我的值对象的示例表
+------------+--------------+
| CategoryID | CategoryName |
+------------+--------------+
| 1 | Category1 |
| 2 | Category2 |
| 3 | Category3 |
| 4 | Category4 |
| 5 | Category5 |
+------------+--------------+
我知道域模型必须是持久性无知的,这就是为什么我打算在 Layer Supertype 中使用 surrogate identites(id 字段)和我的 valueobject 来将持久性问题与域。
区分我的值对象的主要属性是它们的名称
从表示层,我通过命令将标准条目值作为与主键对应的整数 id 发送到使用域服务的应用层。
问题
- * 创建命令时传递标准条目的 id 是否合适,还是应该传递字符串名称?
- * 如果传入id,如果需要name,如何构造标准的入口值对象?
- * 如果 name 被传递,我需要从存储库中找出 id 吗?
- * 或者我只是错误地设计了我的标准条目值对象?
感谢您的帮助。
【问题讨论】:
标签: domain-driven-design cqrs value-objects