猿问

DDD - 实现授权不变量

我是 DDD 的初学者,有一个关于如何为特定域用例实现授权不变量的问题。

我有两个子域:成员身份和身份。身份处理身份验证和管理用户和角色。

有问题的子域是成员资格。成员可以有多种状态。激活成员时,存在三个不变量:

  1. 分会管理员只能激活其分会中的成员

  2. 分会管理员只能激活非活动成员。

  3. 系统管理员可以激活任何状态的任何成员。

用户有角色。这种情况下的角色是系统管理员和章节管理员(单个章节)。

所以我有一个应用程序服务。用户 ID 存储在 .Net Identity 中,但我觉得让应用程序服务不知道 .Net Identity 是个好主意吗?

public void ActivateMember(UserId userId, MemberId memberId)

{

     //This handles invariants 1 & 3

     memberAccess.DoesUserHaveAccessToMember(userId, memberId);


     //But how to I handle 2?


     //here is the call into the domain

     commands.Handle(new ActivateMember(memberId);

}

怎么处理2?命令处理程序是一个域服务,它只加载成员、调用其 activate 成员并将其持久化。身份域中的身份验证服务是否应该被推得那么远?我可以在上面的类中实现 2,但是我必须从存储库中加载该成员两次。那不好吗?


慕田峪7331174
浏览 123回答 1
1回答

拉丁的传说

身份处理身份验证和管理用户和角色因此, Identity 处理身份验证和授权;拥有roles只是应该从其他有界上下文中隐藏的实现细节。这意味着MembershipBC 不应该关心授权是如何工作的,只要它是有效的。所以,为了掩饰这一点,授权BC应该公布这样的接口:canUserActivateMember(userId,memberId)。现在,棘手的部分是,在两个 BC 中都有一个概念,members但它意味着别的东西:在MembershipBC,成员包含(很多)的属性和行为特定于该域,如ID,Name,Status,Gender,进入/离开球杆,无论是在该领域相关在AuthorizationBC 中,成员只包含ID,Chapter和Status,没有行为。该Status属性由来自MembershipBC的反腐败层同步(在 cron 或其他中)。因此,您ActivateMember来自MembershipBC的服务应如下所示:public void ActivateMember(UserId userId, MemberId memberId){     //This handles invariants 1, 2 & 3     if(!authorization.canUserActivateMember(userId,memberId)) {         throw ExceptionOrSomething;     }     //here is the call into the domain     commands.Handle(new ActivateMember(memberId);}在AuthorizationBC 中,该方法canUserActivateMember可能如下所示:public boolean canUserActivateMember(UserId userId, MemberId memberId){    var user = userRepository.load(userId);    var member = memberRepository.load(memberId);    if(user.isSystemAdministrator()){        return true;    }    if(user.isChapterAdministrator() && member.hasChapter(user.getChapter)){        return true;    }    if(user.isChapterAdministrator() && member.isInactive()) {        return  true;    }    return false;//the default  }因此,您有两个Member类,每个 BC 一个,但具有不同的属性和行为。
随时随地看视频慕课网APP
我要回答