4

리포지토리가 사실상 포함하고있는 객체를 기반으로 부울 값을 반환해도 괜찮습니까? 예를 들어DDD : 저장소가 부울 값을 반환 할 수 있습니까?

:

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

을 아니면 그것에게 자세한 방법 할 수있는 더 좋은 방법입니다 :

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

답변

7

이 더 사양처럼되지 않는 소리를?

이전에는 사양으로 처리 했으므로 코드를 사용하여 코드를 검사 해 볼 수 있습니다.

하지만 최근에는 작업을 수행하는 서비스에서이 작업을 수행했으며 에 대한 결과를 기반으로 결과를 작성합니다. 이 같은 뭔가가 :

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 $를 떼어 놓았습니다. ... 하하 나는 PHP에서 내 PHP를 PHP로 변환하여 내 머리 속에 응답합니다! – Steve

+0

예, 쉽게 의사 코드를 쉽게 읽을 수 있어야합니다 :) – Benjamin

4

저장소 저장, 검색 및 개체의 컬렉션을 에뮬레이트 검색 동작을 캡슐화하기위한 메커니즘입니다.

나는이 저장소에있는 모든 개체가 포함 된 메서드 인 경우에만 저장소에서 부울을 반환하는 것이 좋다고 생각합니다. 리포지토리는 일반적으로 컬렉션과 같은 인터페이스를 제공합니다. 예를 들어 users.IsEmpty() 또는 users.IsNameUnique("jdoe")은 전체 컬렉션에 액세스해야하기 때문에 논리적 인 것처럼 보입니다.

시나리오에서는 이름으로 사용자를 찾는 작업 만 저장소에 할당 할 수 있습니다. 암호가 유효한지 여부를 확인하는 것은 저장소에 적합하지 않습니다. 그래서 두 번째, 좀더 장황한 접근 방식이 나에게 더 좋아 보인다.

또는 도메인에 전용 인증 기 인터페이스를 사용할 수 있으며 데이터 저장소 계층에서 구현할 수 있습니다 (리포지토리의 구현 방식과 유사 함). 또는 인증자는 내부적으로 리포지토리를 사용하는 도메인 서비스가 될 수 있습니다. 인증 기는 '사용자를 찾을 수 없음'또는 '비밀번호가 유효하지 않음'을 구분할 수 있습니다. 이는 서로 다른 비즈니스상의 의미를 지닙니다.

+0

하하, 나는 단지 그것을 말하고 있었다. – Steve

관련 문제