2016-02-26 10 views
2

在我的項目,有一個用戶概念的一個發送FriendRequest到用戶B在一個簡化版本,請求如下:聚合根或應用程序服務中的用戶權限檢查?

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

Accept的方法,我需要檢查是否當前已認證的用戶等於FriendRequest中的OtherUserIdcurrentAuthenticatedUserId從控制器傳遞到應用程序服務。現在,問題是我應該在應用程序服務中還是在FriendRequest聚合根中執行檢查。

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

//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. 
+1

這篇文章https://medium.com/p/671f7a5596ac談論DDD授權和認證。披露者:我是作者 – martinezdelariva

+0

@ martinezdelariva謝謝。它讓我有點輕鬆。我會去檢查應用程序服務中的檢查。 – foresightyj

回答

4

訪問控制是應用程序服務的主要職責之一。

因此,檢查應用程序服務中的用戶標識,而不是實體中。

+0

感謝您的回答,特別是提及'訪問控制'。這比我提出的「用戶許可」更好。明確的規則很容易遵循,對我來說很有意義。我知道我應該把業務規則放在聚合根內,但是我很難決定訪問控制是否是業務規則,因爲它看起來非常重要,並且以無處不在的語言顯示。 – foresightyj

1
friendRequest.Accept(...) 

是什麼域中意味着什麼?請求接受自己或接受什麼?我相信,你需要用更多與名詞相關的動詞來擴展你的無處不在的語言。

作爲一個例子,我可能會想到「一個人可以接受另一個人發送的朋友請求」。在這種情況下,您將有一個person.Accept(friendRequest)。然後根據當前的認證細節獲取Person是服務責任。

+0

我可以理解你的建議。這是更多的OOP。我現在沒有任何用戶封裝。我只是傳遞'userId'。在我的應用程序中,幾乎所有事情都由用戶完成,幾乎在任何有界的情況下完成。我對每個有界的上下文有一個'User'模型嗎? – foresightyj