1 回答
TA贡献1789条经验 获得超8个赞
身份处理身份验证和管理用户和角色
因此, Identity 处理身份验证和授权;拥有roles
只是应该从其他有界上下文中隐藏的实现细节。这意味着Membership
BC 不应该关心授权是如何工作的,只要它是有效的。所以,为了掩饰这一点,授权BC应该公布这样的接口:canUserActivateMember(userId,memberId)
。
现在,棘手的部分是,在两个 BC 中都有一个概念,members
但它意味着别的东西:
在
Membership
BC,成员包含(很多)的属性和行为特定于该域,如ID
,Name
,Status
,Gender
,进入/离开球杆,无论是在该领域相关在
Authorization
BC 中,成员只包含ID
,Chapter
和Status
,没有行为。该Status
属性由来自Membership
BC的反腐败层同步(在 cron 或其他中)。
因此,您ActivateMember
来自Membership
BC的服务应如下所示:
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 一个,但具有不同的属性和行为。
- 1 回答
- 0 关注
- 121 浏览
添加回答
举报