2009-09-25 6 views
3

저는 Eric Evans가 "도메인 중심 디자인 : 소프트웨어의 핵심 부분을 다루는 것"을 끝 마치고 C#으로 도메인 중심의 첫 번째 응용 프로그램을 작성하려고합니다.TDD 및 DDD 시작하기

응용 프로그램은 헬프 데스크에서 사용자에게 컴퓨터 할당을 추적하는 데 사용됩니다.

도메인의 일부를 반영하기 위해 간단한 클래스 다이어그램을 그렸습니다. 나는 또한 나의 첫번째 기능 (사용자에게 컴퓨터를 할당하는) 식별 한과에 대한 테스트를 작성했습니다

Class diagram showing two classes: Owner and Computer. There is a one-way associate between Computer and Owner named 'Allocate to' http://www.freeimagehosting.net/uploads/183dd57031.jpg

이 ... ... 다음과 같습니다

[Test] 
public void AllocateToUser() 
{ 
    var user = new Owner("user1"); 
    var computer = new Computer("computer1"); 

    computer.Allocate(user); 

    Assert.AreEqual(user.Username, computer.AllocatedTo.Username); 
} 

마지막으로 테스트 통과를위한 코드를 작성했습니다.

public class Computer 
{ 
    public Computer(string name) 
    { 
     Name = name; 
    } 

    public string Name 
    { get; private set; } 

    public Owner AllocatedTo 
    { get; private set; } 

    public void Allocate(Owner owner) 
    { 
     AllocatedTo = owner; 
    } 
} 

public class Owner 
{ 
    public Owner(string username) 
    { 
     Username = username; 
    } 

    public string Username 
    { get; private set; } 
} 

지금까지 너무 좋았습니다.

그러나 분명히이 중 어느 것도 지속성을 언급하지 않습니다. 나는 컴퓨터를위한 저장소 클래스를 소개 할 필요가 있다고 생각한다. 아마도 다음과 같은 것일 수 있습니다.

나는 이제 막혔습니다. 컴퓨터에 할당 된 사용자에 대한 변경 사항을 저장소로 전달하는 방법은 무엇입니까?

나는 다음과 같은 옵션을 갖고있는 것 같다 :

  1. 는 ComputerRepositry의 인스턴스를 instanstiate 및 저장 (Store) 메소드를 호출하기 위해 컴퓨터 클래스의 할당 방법의 구현을 수정합니다.

  2. 인터페이스 만들기 IComputerRepository; IComputerRepository를 구현하는 클래스 인스턴스가 제공되도록 Computer 생성자를 수정합니다. Allocate 메서드 내에서이 주입 된 인스턴스에 대해 Store를 호출합니다.

  3. 할당 및 저장에 대한 호출을 마무리하는 서비스 (AllocationService)를 만듭니다. 호출 코드에 대한 두 단계를 강제로 클라이언트에

  4. 패스 resposibility :

    • 호출이 ComputerRepository의 인스턴스를 인스턴스화 컴퓨터 클래스
    • 의 인스턴스에 할당 및 저장을 호출합니다. 이들의

어느 것도 만족스러운 보이지 않는다 : 나는 컴퓨터 클래스에서 직접 저장소를 인스턴스화 할 것 같은

  1. 을 테스트하기 어렵다.

  2. 은 의존성 주입을 사용하여이 문제를 방지합니다. 그러나 내가 컴퓨터를 인스턴스화 할 때마다 IComputerRepository의 일부 인스턴스를 전달해야하므로 여전히 추한 것입니다.

  3. 은 절차가 너무 복잡하여 도메인 엔터티 클래스 내에 동작을 캡슐화하지 못했습니다.

  4. 그냥보기 흉하게 보입니다.

어떻게해야합니까?

답변

5

대개 나는 행동과 지속성을 두 가지 다른 관심사로 취급하고 개별적으로 테스트합니다.

도메인 객체는 저장소의 존재를 잊어 버려야합니다 (분명히 다른 방법은 아니지만).

이 상황에서 수행 한 작업은 해당 리포지토리에서 적절한 개체를로드하고 해당 개체에서 동작을 호출 한 다음 해당 리포지토리에서 업데이트를 지속하도록 호출하는 컨트롤러 (또는 서비스)를 만드는 것입니다.

그런 다음 모의 저장소를 사용하여 컨트롤러를 테스트하여 컨트롤러가 업데이트 된 개체로 저장소를 호출하는지 확인할 수 있습니다.