用户权限检查聚合根或应用程序服务?

时间:2016-02-26 10:24:30

标签: domain-driven-design aggregateroot

在我的项目中,有一个概念是用户A向用户B发送FriendRequest。在简化版本中,请求如下所示:

class FriendRequest 
{
     long Id;
     int UserId;
     int OtherUserId;
     string Message;
}

Accept方法中,我需要检查当前经过身份验证的用户是否等于OtherUserId中的FriendRequestcurrentAuthenticatedUserId从控制器传递到应用程序服务。现在,问题在于我是应该在应用程序服务中还是在FriendRequest聚合根目录中进行检查。

//In application service code:
if(currentAuthenticatedUserId !=friendRequest.OtherUserId)
{
    throw new FriendRequestException("Can only accept friend requests sent to you");
}
friendRequest.Accept();

VS

//In application service, but we are not checking it here.
friendRequest.Accept(currentAuthenticatedUserId); //The check is done inside `FriendRequest` and the exception is also thrown there.

2 个答案:

答案 0 :(得分:4)

访问控制是应用程序服务的主要职责之一。

因此,请检查应用服务中的用户ID,而不是实体中的用户ID。

答案 1 :(得分:1)

friendRequest.Accept(...)

域名中的含义是什么?请求接受自己或接受什么?我相信,你需要用更多与名词相关的动词扩展你无处不在的语言。

作为一个例子,我可能会想到“一个人可以接受由另一个人发送的朋友请求”。在这种情况下,您将拥有person.Accept(friendRequest)。然后,服务职责是根据当前的身份验证详细信息获取Person