2011-02-24 5 views
3

저는 서비스 레이어에 유효성 검사 코드를 넣으라고하는 많은 책과 기사 예제를 보았습니다. 도메인 객체를 "벙어리"(일명 순수 POCO)로 유지하고 도메인 객체가 서비스 계층에서 수행 할 수있는 모든 유효성 검사를 처리합니다.서비스 계층 유효성 검사 대 도메인 개체 유효성 검사; 도메인 객체의 잠재적 인 "남용"?

서비스 레이어 (Service Layer)는 너무나 많은 책임이 있습니다 (또는 적어도 그렇게 할 수 있습니다). 사용자 인증, 역할 인증, IoC (로거, 오류 처리기 등)에 대한 종속성 객체 스크립팅, 도메인 객체 스크립팅, 리포지토리 스크립팅 및 리포지토리에 도메인 객체 전달 등의 기능을 제공합니다.

서비스 레이어에서 이러한 규칙을 모두 작성하지 않으면 도메인 객체에 심각한 위협이 될까요? 예를 들어, 일부 프로그래머는 도메인 객체에 대해 직접 소비 코드를 작성하고 서비스 레이어를 모두 무시하기로 결정합니까? 그것은 나쁘지 만 믿을만한 상황입니다.

모든 도메인 개체 유효성 검사를 포함하여 서비스 계층에 많은 책임을 맡길 경우 누군가가 직접 도메인 개체를 "보호"할 수있는 방법이 있습니까? 예를 들어 어쩌면 도메인 객체가 특정 클라이언트 (이 경우 서비스 레이어)에서 사용되지 않고있는 것일 수 있습니다.

좋은 디자인은 도메인 객체가 누구를 호출하고 어떻게 호출되는지에 대해 알 필요가 없다고 생각합니다.

도메인 객체를 "잠그는"방법이 없다면 왜 많은 기사, 서적 등은 도메인 객체 유효성 검사를 서비스 레이어에 적용하는 것이 좋습니다. 나는 방위 프로그래밍의 입장을 취하여, 방탄복으로 도메인 객체를 만들고, UI와 BAL/DAL 간의 요청 전달 및 수신을위한 간단한 코드 레이어를 위해 서비스 레이어에 의존해야한다고 생각합니다.

누구나 서비스 계층을 우회 한 사람들로부터 도메인 객체의 "남용"에 대한 실제 프로젝트 경험이 있습니까?

답변

1

두 가지 디자인 철학이 있습니다. 풍부한 도메인 모델 대 빈혈 도메인 모델.

간단히 대답하면 네 도메인 개체에 대한 직접 액세스를 차단할 수 있습니다.

당신은 기술의 번호와 그렇게 할 수 있습니다 :

1) 당신은 모든 공공 직면 도메인이 불변의 개체를 만들 수 있습니다 (당신은 단지 공공의 방법 게터 할 필요 통해 데이터)를 변경할 수 없습니다 즉. 개체를 수정하는 모든 메서드는 보호되거나 패키지 전용이므로 올바르게 패키지 된 서비스 만 액세스 할 수 있습니다 (Java에서는 최소)
2) 외부 개발자에게만 별도의 클래스를 표시 할 수 있으므로 Person 도메인이있는 경우 PersonInfo 클래스를 가질 수 있으며, 정보를 포함하지만 아무것도 포함하지 않습니다.
3) 일관된 API를 앱 사용자에게 노출해야합니다. 기본적으로 사용자가 서비스 계층을 우회하지 못하도록합니다.

+0

# 2는 데이터 전송 객체와 비슷합니다. DTO를 사용하거나, 최종 소비자가 설정/가져야하는 속성 만 공개하는 인터페이스를 반환 할 수 있습니까? 몇 가지 다른 접근법을 가지고 놀아 보겠습니다.DTO를 피하기 위해 프로젝트에 또 다른 복잡한 레이어를 추가 할 수 있기를 희망했습니다. 답장을 보내 주셔서 감사합니다! –

+0

@indiecodemonkey 그렇습니다. 하지만 요점은 API를 잠그는 방법이 있다는 것입니다. – hvgotcodes

2

POCO의 목적을 오해 할 수도 있습니다. POCO는 속성과 속성 만있는 빈혈이없는 도메인 객체는 아닙니다. 오히려 POCO는 단순히 프레임 워크 또는 복잡한 상속 모델과 관련이 없습니다. 객체는 유연하며 도메인에서의 역할에만 관심이 있습니다.

+1

이것은 아마도 hvgotcodes의 대답에 대한 코멘트 일 것입니다. –

+0

여호수아와 동의하십시오. 빈혈 도메인 모델은 잘 방어 된 많은 이유로 안티 패턴으로 간주됩니다. 남자 답게 http://martinfowler.com/bliki/AnemicDomainModel.html –

관련 문제