문제

빠른 질문:도메인 기반 디자인 스타일 저장소를 싱글톤으로 구현하는 것이 좋은 생각일까요, 아니면 나쁜 생각일까요?왜?

아니면 내 리포지토리를 관리하고 싱글톤인지 아닌지를 결정하기 위해 종속성 주입기 ​​컨테이너를 사용해야 할까요?

난 아직도 읽고 있어요 신속하게 DDD, 좋은 저장소 예제를 보고 싶습니다.

도움이 되었습니까?

해결책

나는 이것을하는 몇 가지 방법을 보았다.

가장 일반적인 방법은 종속성 주입을 사용하여 리포지토리를 사용하는 객체에 주입하는 것입니다. 일반적으로 이들은 발표자 또는 컨트롤러 클래스이지만 경우에 따라 모델이 저장소로 호출됩니다. 일반적으로 이것을 피하면 더 좋습니다. DI 컨테이너를 사용하여이를 수행 할 수 있다면이를 위해 가십시오.

저장소가 싱글 톤 패턴을 구현할 수도 있습니다. 싱글 톤은 일반적으로 정적 방법을 사용하기 때문에 이것을 피하려고 노력할 것입니다. 이로 인해 싱글 톤으로 호출되는 코드를 테스트하는 것이 더 어려워 질 수 있습니다. 이런 식으로 작업을 수행 해야하는 경우 싱글 톤을 호출하는 코드를 분리하고 "매뉴얼"종속성 주입을 사용하여 싱글 톤을 호출하는 클래스에 주입하십시오. 이것은 당신이 얻을 수있는 단단한 커플 링을 제거합니다.

리포지토리가 결코 호출되지 않는 몇 가지 예를 보았습니다. 누군가 모델에서 객체 그래프를 탐색하고로드되지 않은 객체를 요청하면 모델이 이벤트를 올리면 저장소 가이 이벤트에 반응합니다. 이렇게하면 저장소에 대한 호출이 없으며 모델에서 완전히 분리됩니다. 나는이 아키텍처를 직접 사용하지 않았지만 매우 깨끗해 보인다.

다른 팁

의존성 주입 컨테이너를 사용하여 저장소가 어떻게 그리고 어디에서 생성되는지 결정하십시오.

사용하여

UserRepository.Instance.Find(userId);

당신은 테스트에 대한 장벽을 만들고 있습니다.

생성자 주입을 사용하여 리포지토리를 서비스로 전달하면 모의로 쉽게 교체 할 수도 있습니다.

나는 이것에 대해 확신하지 못하고 같은 문제가 있습니다. 작업하는 객체가 자주 사용될 때 저장소를 싱글 톤으로 만들어야한다고 생각합니다. 저장소는 객체에 대해 많은 메모리를 사용하고 응용 프로그램을 사용하는 동안 한 번만 호출되고 다시는 절대 호출되지 않기 때문에 드물게 작동하는 객체를 사용하는 경우 싱글 톤을 만들어서는 안됩니다. 내가 말했듯이, 이것은 올바른 생각이 아닐 수도 있습니다.

제가 정말 큰 프로젝트를 가지고 있고 새로운 서비스를 추가하고 싶다고 가정해 보겠습니다. 그것이 내 시스템의 일부 하드웨어 대표자가 될 것이라고 가정해 보겠습니다.나는 많은 클래스를 통해 이 서비스에 액세스할 수 있기를 원하며, 서비스에 대한 액세스를 제어하는 ​​서비스 또는 레이어의 인스턴스가 하나만 있는지 확인하고 싶습니다.내 시스템(200개 이상의 클래스) 전체에 이 서비스를 주입하는 것은 많은 작업이 될 것입니다.나에게는 "Singleton" 또는 일부 "Service Locator"가 이 작업에 적합합니다.

이해하는 한 도메인에는 저장소 인터페이스 만 포함되어 있으므로 단일 인터페이스에 대한 많은 리포지토리 구현이있을 수 있습니다. 따라서 인터페이스에서 정적 메소드를 정의 할 수 없기 때문에 저장소는 정적 클래스가 될 수 없습니다. (참고 : 일부 언어에서는 인터페이스에서 정적 메소드를 정의 할 수 있지만 나에게는 의미가 없습니다.)

저장소는 일반적으로 엔티티를 데이터베이스, 파일 등과 동기화하는 것입니다. 이는 싱글 톤이 될 수 없다는 것을 의미합니다. 여기에 있습니다 기사 그것에 대해. 재미있는 부분조차도 도메인에서 싱글 톤을 사용할 수 있다고 말합니다.

내가 이해하기 위해 많은 대신 단일 엔티티 만 있는지 확인하는 저장소를 만드는 것이 훨씬 깨끗합니다. 그것은 코드가 당신의 코드를 충족시키기를 원한다면 엔티티가 아니라 저장소의 직접적 가능성입니다. 단일 책임 원칙.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top