2010-08-10 6 views
7

저는 DDD에 대해 읽고 있습니다. 나는 서비스를 잘못 사용하고 있거나 적어도 이상적인 방식으로 사용하지는 않을 것이라고 생각합니다. 내 서비스 클래스는 저장소 참조를 포함하는 인스턴스 변수가 많고 많은 작업 (즉 많은 메소드가 있음)이있는 것처럼 보입니다.서비스 계층을 올바르게 사용하고 있습니까?

보다 집중된 서비스를 만드는 것이 좋습니다. 특정 논리를 수행하는 서비스 당 하나의 메소드와 마찬가지로? 또한 서비스 클래스는 인스턴스 변수를 다른 엔티티에 저장해야합니까? 무국적 인 서비스에 대해 읽었을 때, 그 인스턴스 변수를 가지고 규칙을 어긴다면 확실하지 않습니다.

감사합니다.

답변

14

내 서비스 클래스는이 반드시 코드 냄새없는 아주 몇 인스턴스 변수 ...

을하는 경향이있다. 서비스가 작업을 완료하는 데 많은 종속성을 필요로하는 경우 이는 단순한 사실입니다.

... 그들은 많은 작업을 수행합니다 (예 : ). 많은 방법이 있습니다.

보다 집중된 서비스를 만드는 것이 좋습니다.

일반적으로 서비스 인터페이스를보다 정교하게 만들면 (즉, 메소드 수가 적을수록) 원하는 메소드를 찾는 인터페이스가 50 개 이상있는 인터페이스를 통해 트래버스해야합니다. 전화할까요?). 하지만 공개 API로 공개하지 않는 한, 서비스 인터페이스의 세분성을 개선 할 수 있습니다. 종종 프로젝트를 시작할 때 단 하나의 서비스로 시작하여 시간이 지남에 따라 나눕니다. 당신이 이러한 서비스의 소비자라면, 인터페이스의 고통이 커지는 것을 느끼기 시작할 때, 깨뜨릴 시간임을 알게 될 것입니다. 물론 이 공개 API 인 인 경우 훨씬 더 많은 초기 디자인을 수행해야합니다.

또한 서비스 클래스는 인스턴스 변수를 다른 엔터티에 저장해야합니까? 무국적 인 서비스에 대해 읽었을 때, 그 인스턴스 변수를 가지고 규칙을 어긴다면 확실하지 않습니다.

종속 변수를 인스턴스 변수로 저장한다고해서 반드시 인스턴스 변수가 상태 비 저장되어있는 한 서비스가 비 상태 변수가 아니라는 것을 의미하지는 않습니다. 무 상태로 간주되기 위해서는 서비스에 대한 메소드 호출이 호출되는 이전 메소드에 의존해서는 안됩니다. 단일 서비스 인스턴스를로드하여 애플리케이션에 공유 할 수 있어야합니다 (예 : 상태 비 저장 서비스의 인스턴스가 특정 사용자의 세션과 관련이 없어야 함). 즉, 메서드 호출 사이에 상태가 유지되지 않아야합니다. 서비스 인스턴스의 상태 변수없는 저장소 의존성을 변수로 저장하더라도이 요구 사항을 위반하지 않습니다.

상태 비 저장 서비스가 바람직한 목표 인 이유는 상태가 없기 때문에 버그 가능성을 크게 줄입니다.이전의 서비스 상태에 대해 걱정할 필요없이 전달 된 매개 변수를 변경하여 테스트 케이스를 제한함으로써 서비스 메소드의 테스트를 단순화합니다. 또한 성능 이점을 제공 할 수도 있습니다.

+0

위대한 답변 MJ에게 감사드립니다! 이것은 많은 도움이됩니다. – chobo

+0

@MJ Richardson 이메일 ID를 공유 할 수 있습니까? (내 프로필에 추가됩니다.)이 게시물에 대해 명확히하고 싶습니다. –

0

종속성 주입, 제어 반전 등을 읽는 것이 좋습니다.

Fowler의 기사 : http://martinfowler.com/articles/injection.html, 나는 항상 그를 맨 위로 조금이라도 알았지 만. DI/IoC 컨테이너를 사용하는 자습서를 살펴 보겠습니다.

관련 문제