我正在阅读 Vaughn Vernon 关于实现领域驱动设计的书。我也从他的 github here 浏览了本书的代码,C# 版本。
这本书的Java版本有装饰器@Transactional,我相信它来自spring框架。
public class ProductBacklogItemService
{
@Transactional
public void assignTeamMemberToTask(
string aTenantId,
string aBacklogItemId,
string aTaskId,
string aTeamMemberId)
{
BacklogItem backlogItem =
backlogItemRepository.backlogItemOfId(
new TenantId(aTenantId),
new BacklogItemId(aBacklogItemId));
Team ofTeam =
teamRepository.teamOfId(
backlogItem.tennantId(),
backlogItem.teamId());
backlogItem.assignTeamMemberToTask(
new TeamMemberId(aTeamMemberId),
ofTeam,
new TaskId(aTaskId));
}
}
C# 中等效的手动实现是什么?我在想一些事情:
public class ProductBacklogItemService
{
private static object lockForAssignTeamMemberToTask = new object();
private static object lockForOtherAppService = new object();
public voice AssignTeamMemberToTask(string aTenantId,
string aBacklogItemId,
string aTaskId,
string aTeamMemberId)
{
lock(lockForAssignTeamMemberToTask)
{
// application code as before
}
}
public voice OtherAppsService(string aTenantId)
{
lock(lockForOtherAppService)
{
// some other code
}
}
}
这给我留下了以下问题:
- 我们是按应用程序服务锁定还是按存储库锁定?即我们不应该这样做
backlogItemRepository.lock()
吗? - 当我们将多个存储库作为应用程序服务的一部分读取时,我们如何在事务期间保护存储库之间的依赖关系(聚合根通过身份引用其他聚合根)——我们是否需要在存储库之间建立互连锁?
- 是否有任何 DDD 基础架构框架可以处理任何此类锁定?
编辑
使用事务有两个有用的答案,因为我没有选择我的持久层我正在使用内存存储库,这些非常原始并且我编写了它们(它们没有事务支持,因为我不知道如何添加!)。
我将设计系统,因此我不需要同时对多个聚合根进行原子更改,但是我需要在多个存储库中一致地读取(即,如果 BacklogItemId 从多个其他聚合中引用,那么如果 BacklogItemId 被删除,我们需要防止竞争条件)。
那么,我可以只使用锁,还是需要考虑在我的内存存储库中添加 TransactionScope 支持?