2009-09-01 2 views
3

리포지토리 클래스를 만들 때. CustomerRepository, 제 방법은 정적이어야합니까?DDD 리포지토리

먼저 CustomerRepository 클래스를 인스턴스화 한 다음 인스턴스에서 public 메서드를 호출해야합니까?

어떤 접근 방식이 가장 좋고 그 이유는 무엇입니까? 나는 단순히 단위 테스트에 대한 instance로 가고 싶어

감사

답변

-4

정역학 테스트하기 어려운, 그러나 동시에, 정적이 전화를 eaier 있으며, 모든 대신 저장소를 시작하고 메소드를 호출하고 저장소를 폐쇄하는 하나의 방법까지 가져올 수 있습니다. 이를 구현하는 데는 여러 가지 방법이 있습니다. 다음에 나오는 방법이 가장 좋습니다. 정적 메서드를 재정의 할 수 없기 때문에 장래에 기능을 상속하고 확장하려는 경우 약간 어렵습니다. ...

우리가 가지고있는 또 다른 방법은 ... 우리는 인스턴스 방법이 있지만 예를 들면 .. 한 정적 변수를 가지고

CustomerRepository.Repository.GetAll(); 

이며 이는 그 구현 방법이다

class CustomerRepository{ 

    // Only one static variable  
    public static CustomerRepository Repository = new CustomerRepository(); 

    // all methods are instance methods.. 
    public IEnumerable GetAll(){ 
    ... 
    } 

} 
+0

새 인스턴스(). DoSomething()은 Instance(). DoSomething()처럼 쉽게 호출 할 수 있습니다. 그러나 정적 메서드로 사용할 수 있지만 인스턴스 클래스를 전환 할 수있는 이점이있는 정적 클래스로 래핑 된 인스턴스 메서드가있는 비슷한 접근 방식을 사용했습니다. 내가 만질 수없는 제 3 자 수업을 위해 이것을 예약하는 경향이 있습니다. – Finglas

+0

하지만 새로운 연산자 오버 헤드를 고려할 때마다 메서드를 호출하는 것이 좋지 않습니다. 프로그래밍 디자인의 많은 부분이 "풀링"에 대해 이야기합니다. 즉, 두 가지 방법 모두 더 많은 책 보관 작업이 필요하기 때문에 객체를 재사용하고 생성하는 것을 의미합니다. CPU를 사용 중 상태로 만들고 오브젝트 힙 크기를 늘릴 수 있습니다. –

+0

문제가 될 때까지 '새로운'오버 헤드에 대해 걱정하지 마십시오. 조숙 한 최적화 및 그 모든 ... – Finglas

3

나는 항상 내 저장소에 대한 계약을 설명하는 인터페이스를 작성합니다. 따라서 정적 멤버의 경로는 사용하지 않습니다.
이미 언급 된 테스트 용이성뿐만 아니라 내 리포지토리에 '컨텍스트'가 있어야한다는 사실 때문에.
더 구체적으로, 나는 OR/M 매퍼로 NHibernate를 사용하고 저장소 인스턴스에 사용해야하는 ISession을 전달한다. 그렇게함으로써, 여러 저장소는 동일한 Session (UnitOfWork)을 사용할 수 있으며, 따라서 동일한 트랜잭션 내에서 여러 유형이 지속될 수 있습니다.

1

인터페이스 ICustomerRepository를 적절히 만들어야하며 해당 인터페이스에서 파생 된 CustomerRepository 클래스를 만들어야합니다.

이유는 테스트 가능성입니다.

이제 테스트에서 CustomerRepositotory의 구체적인 인스턴스를 일부 mock 객체로 조롱 할 수 있습니다.

또한이 저장소의 구현을 쉽게 바꿀 수 있으며 로깅이나 캐싱을 추가 할 수 있습니다.

통계에 관해서는. 정적 인스턴스를 사용하려면 일부 종속성 삽입 도구를 사용하고 구성 요소의 라이프 스타일을 싱글 톤으로 설정하는 것이 좋습니다. 그것은 아직도 시험 될 것입니다.