为了账号安全,请及时绑定邮箱和手机立即绑定

DDD - 实现授权不变量

DDD - 实现授权不变量

C#
慕田峪7331174 2021-06-18 15:53:17
我是 DDD 的初学者,有一个关于如何为特定域用例实现授权不变量的问题。我有两个子域:成员身份和身份。身份处理身份验证和管理用户和角色。有问题的子域是成员资格。成员可以有多种状态。激活成员时,存在三个不变量:分会管理员只能激活其分会中的成员分会管理员只能激活非活动成员。系统管理员可以激活任何状态的任何成员。用户有角色。这种情况下的角色是系统管理员和章节管理员(单个章节)。所以我有一个应用程序服务。用户 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,但是我必须从存储库中加载该成员两次。那不好吗?
查看完整描述

1 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

身份处理身份验证和管理用户和角色

因此, Identity 处理身份验证和授权;拥有roles只是应该从其他有界上下文中隐藏的实现细节。这意味着MembershipBC 不应该关心授权是如何工作的,只要它是有效的。所以,为了掩饰这一点,授权BC应该公布这样的接口:canUserActivateMember(userId,memberId)

现在,棘手的部分是,在两个 BC 中都有一个概念,members但它意味着别的东西:

  • MembershipBC,成员包含(很多)的属性和行为特定于该域,如IDNameStatusGender,进入/离开球杆,无论是在该领域相关

  • AuthorizationBC 中,成员只包含ID,ChapterStatus,没有行为。该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 一个,但具有不同的属性和行为。


查看完整回答
反对 回复 2021-06-27
  • 1 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信