2010-12-13 6 views
4

안녕 나는 DDD에 따라 신청하려고하고있다. 난 다음 엔터티 있습니다공장에서 저장소를 사용하는 방법

 

public class Item 
{ 
     public Category Category { get; protected set; } 

     ... 
} 

public class SpecificItem : Item 
{ 
     ... 
} 

public class Category 
{ 
     public static int IdOfCategoryForSpecificItem = 10; 

     public int Id { get; set; } 
} 

을 그리고 지금은 SpecificItem 유형의 개체를 만드는 방법 공장를 작성하고 싶습니다. 그러나이 특정 항목은 특정 범주에 있어야합니다.

 
public class ItemFactory 
{ 
     public static SpecificItem CreateSpecificItem(object someArguments) 
     { 
      IRepository<Category> repository = null // How to get repository? 

      return new SpecificItem 
      { 
       Category = repository.FirstOrDefault(i => i.Id == Category.IdOfCategoryForSpecificItem), 
       // additional initialization 
      }; 
     } 
} 

그리고 지금 내 질문 :

  1. 그것은 저장소에 공장을 만들고 사용하는 올바른 방법입니다 그래서 이런 공장을 만들어?
  2. 저장소를 얻는 방법? DI는 정적 메서드이기 때문에 사용할 수 없습니다. 단위 테스트가 어렵 기 때문에 ServiceLocator를 좋아하지 않습니다.
  3. 아마도이 문제에 대한 더 나은 해결책이 있습니다.

답변

8

ItemFactory에 의존성 주입을 사용하고 생성자 주입을 사용하여 IRepository<Category>을 주입하십시오. 그 일을 한 후, ItemFactory는 다음과 같이 표시됩니다

public class ItemFactory 
{ 
    private readonly IRepository<Category> repository; 

    public ItemFactory(IRepository<Category> repository) 
    { 
     this.repository = repository; 
    } 

    public SpecificItem CreateSpecificItem(object someArguments) 
    { 
     return new SpecificItem 
     { 
      Category = this.repository.FirstOrDefault(i => 
       i.Id == Category.IdOfCategoryForSpecificItem), 
      // additional initialization 
     }; 
    } 
} 

이 방법은 호출자에게 IRepository<Category>의 구현을 검색하는 책임을 움직였다. 이제 ItemFactory이 필요한 모든 유형에 대해 동일한 작업을 수행 할 수 있습니다. 이 유형의 생성자에 ItemFactory을 종속으로 삽입하십시오. 이것을 응용 프로그램의 유형 계층 구조의 최상위까지 최대한 수행하고 유형을 구성하십시오 (composition root).

특히 IoC/DI 프레임 워크는 유형 생성을 자동화하는 데 매우 유용합니다.

+1

+1 단일 책임입니다. – poindexter12

+0

내가 가진 유일한 관심사는 집계 서비스에 집계 서비스를 제공하지 않기 때문에 카테고리가 적어도 DDD의 의미에서 저장소가 있어야하는 것처럼 보이지 않는다는 것입니다. ORM 수준에서 저장소를 사용하는 것은 의미가 있지만 적어도 공장 구현은 여전히 ​​응용 프로그램 인프라라고 생각하기 때문에 이해할 수 있습니다. – jpierson

+0

'IRepository'는 불변이어야합니까? 그렇지 않다면 팩토리는 동일한 인수에 대해 다른 결과를 생성합니다. – astef

0

필자는 이것이 문법을 둘러싼 수수께끼가 더 나은 해결책을 제시하고있는 시대라고 생각합니다.

DI가 당신을 위해 할 수있는 것과 정적 속성이 방지 할 수있는 것만 큼 각각의 클래스마다 다른 저장소가 필요할 것 같습니다.

그러나 나는 또한 당신이 여기서 당신의 이름을 혼란스럽게 생각한다고 생각합니다. 공장은 어떤 유형의 새로운 아이템을 만듭니다. 반면에, 부 록은 그 타입의 아이템을 저장/유지합니다. 생성하거나 검색하고 있습니까?

제 제안은 이들을 분리하여 새 팩토리를 생성하고 기존 저장소를 저장/검색하는 저장소를 구현하는 것입니다. DI를 사용하여 런타임에 유형에 따라 구체적인 구현을 결정하십시오.

1

Dao서비스 클래스를 제안합니다. Dao가 데이터에 대한 액세스를 구성하는 동안 Service는 Dao를 사용하여 데이터를 관리합니다. 스키마는 다음과 같습니다
이 는하지만, 서비스 수준이 매우 일반화 된 스키마의
하여 공장의 저장소를 제공
3) 서비스 수준의 저장소를 형성하는 데이터
2)에 대한 액세스를지고 내가 1) 다오 수준의 희망 내 대답이 너를 도울거야.

관련 문제