4

Repository是否可以基於它(虛擬)包含的對象返回布爾值?DDD:倉庫能否返回布爾值?

例如:

if (userRepository.checkCredentials(username, password)) 
{ 
    // ... 

或者是一個更好的方法來做到這一點的詳細方式:

user = userRepository.findByUsername(username); 
if (user != null && user.checkPassword(password)) { 
{ 
    // ... 

回答

7

聽起來更像是一種規範,不是嗎?

if (canAuthenticateSpec.isSatisfiedBy(username, password)) 

在過去,我已經完成了這個與規範,所以我可以清楚,簡單地檢查我的代碼使用。

但是,最近我做了這項工作,並建立了一個基於爲什麼他們沒有進行身份驗證的結果。所以,什麼的,就像這樣:

AuthenticateResult result = slAuthenticator.Authenticate(username, password) 
if (result.authenticated) { 
    user = result.user 
} else { 
    String message = result.failureReason; 
+0

這實際上是用在驗證適配器(Zend_Auth)中的代碼,所以你的回答很有意義! – Benjamin

+0

哈哈,等一下,一個Zend_Auth適配器,所以你從變量中拉出了所有的PHP $ ... HAHA我把我的PHP從我的頭轉換到java-ese來回應! – Steve

+0

是的,這應該是僞代碼,易於閱讀:) – Benjamin

4

庫是用於封裝存儲,檢索和模仿對象集合 搜索行爲的機制。

我認爲從庫中返回布爾值是可以的,但前提是該方法涉及此庫中的所有對象。存儲庫通常暴露類似集合的界面。例如users.IsEmpty()users.IsNameUnique("jdoe")似乎是合乎邏輯的,因爲它們需要訪問整個集合。

在您的方案中,只能按名稱查找用戶是可以分配給存儲庫的責任。檢查密碼是否有效似乎不太適合存儲庫。所以第二種更詳細的方法對我來說似乎更好。

或者,您可以在您的域中擁有一個專用的Authenticator接口,並在數據訪問層實現(類似於存儲庫的實現方式)。或者Authenticator可以成爲一個在內部使用倉庫的域服務。 Authenticator還可以在'用戶未找到'或'密碼無效'之間進行區分,這可能會有不同的業務含義。

+0

哈哈,我只是這麼說的。 – Steve