문제

독서 후반의 과 닐슨의 책 나는 아직 확실하지 않은 데이터 액세스를 관리하는 방법에는 도메인 중심의 프로젝트에 적합합니다.해야한 CRUD 방법의 일부분이 저장소,즉OrderRepository.GetOrdersByCustomer(고객)또는 그들의 일부가 될체:고객입니다.GetOrders().후자의 접근을 더 많은 것 같다 OO 나,배포를 위한 데이터 액세스 하나의 엔티티 유형 중에서 여러 개체,즉고객입니다.GetOrders(),청구서이다.GetOrders(),ShipmentBatch.GetOrders(),등등.에 대해 무엇을 삽입 업데이트 및?

도움이 되었습니까?

해결책

CRUD-틱 방법의 일부가 될...저장소 틱.그러나 나는 당신이해야 이유를 물어 당신의 무리가 있 CRUD 방법이 있습니다.그들은 무엇 니까?그들은 무엇 니까?만약 당신이 실제로 부르는 데이터 액세스턴의 응용 프로그램은 그것을 생각하게 저장소 훨씬 더 유용하고 필요에서 당신을 유지하지총술할 때 특정 유형의 변경이 발생하는 귀하의 도메인에 있습니다.

CustomerRepo.GetThoseWhoHaventPaidTheirBill()

// or

GetCustomer(new HaventPaidBillSpecification())

// is better than

foreach (var customer in GetCustomer()) {
    /* logic leaking all over the floor */
}

"저장"을 입력 방법도의 일부가 될 것입니다.

이 있는 경우 집계 뿌리,이것에서 당신을 유지하는 저장소의 폭발 또는 논리 퍼져:당신 없 4x#의 엔티티 데이터 액세스턴,사람들은 당신이 실제로 사용하여 집계의 뿌리입니다.

내$.02.

다른 팁

DDD 일반적으로 선호하는 패턴을 저장소를 통해 현재 레코드 패턴 당신은 힌트를 할 수 있도록 최선을 다하겠습니다.저장합니다.

하나의 단점에서의 활동 기록을 모은 그것이 거론 하나의 지속성 모델을 제외하고 몇 가지 특별히 관입 코드(대부분의 언어에서).

저장소 인터페이스에 정의된 도메인 레이어지고 있는 데이터가 저장된 데이터베이스에서나지 않습니다.저장소와 패턴,를 만들 수 있습니다 InMemoryRepository 할 수 있도록 테스트 도메인 논리에 격리,사용성 주입에서는 응용 프로그램 서비스는 계층화 SqlRepository,예를 들어.

많은 사람들을 가지고,특별 저장소 테스트를 위한 소리는 바보 같지만,사용하는 경우에 저장소 모델을 찾을 수 있습니다 당신은 정말 필요 없이 데이터베이스에 대한 귀하의 특정 응용 프로그램때로는 간단한 FileRepository 될 것이다.결혼식을 자신하여 데이터베이스하기 전에 당신이 할 필요가 있다는 사실을 알고 그것은 잠재적으로 제한하고 있다.는 경우에도 데이터베이스에 필요한,그것은 많이 더 빨리 실행에 대한 테스트는 InMemoryRepository.

지 않는 경우가 많의 방법으로 도메인 논리,당신은 아마이 필요하지 않 DDD.ActiveRecord 은 매우 적합합을 위해 많은 문제,특히는 경우가 대부분이터와 약간의 논리입니다.

자 단계에 다시 두 번째.에반스는 것이 좋 저장소를 반환 aggregate 뿌리지 않는 단체.그래서 가정하는 고객은 집계 루트를 포함하는 주문,그 때 당신은 가서 고객이 그것의 저장소,주문이 함께했다.당신은에 액세스하여 주문을 탐색하는 관계에서 고객을 주문입니다.

customer.Orders;

그래서 당신의 질문에 대답하,CRUD 작업에 존재하는 집계 뿌리 저장소.

CustomerRepository.Add(customer);
CustomerRepository.Get(customerID);
CustomerRepository.Save(customer);
CustomerRepository.Delete(customer);

나는 그것을 모두 방법을 말하는 내가 선호하는 방식 지금은 지속적인 무지(또는 PONO--일반 Ole'.Net 개체)방법 당신의 도메인 클래스는 것에 대해 걱정 도메인 클래스입니다.그들이 하는 방법에 대해 아무것도 몰라 그들이 지속되거나는 경우에도 그들은 유지됩니다.물론 당신은 실용적인에 대한 이 시간에 허용한 것과 같은 Id(그러나 그때 그 사용하여 레퍼 유형의 Id 그래서 내가 있을 수 있는 하나의 포인트는 것 같은 기본값은 라이브)

에 대한 주요 이유이기 위해 노력하고 원칙에 따라 하나의 책임입니다.여 다음과 같은 이 원리를 발견했 내 코드는 훨씬 더 많은 테스트하고 유지 관리할 수 있습니다.그것은 또한 매우 쉽게 변경할 때 필요한 때문에 나는 단지 하나의 일을 생각합니다.

한 가지의 깊은 방법을 팽창된 저장소에서 고통을 수 있습.GetOrderbyCustomer..GetAllOrders..GetOrders30DaysOld..etc.중 하나에 좋은 이 문제의 해결책에서 보는 것입 쿼리를 개체 패턴이다.다음 저장소할 수 있습니다 쿼리에 객체를 실행할 수 있습니다.

도 강력하게 추천으로 찾고 무언가가 다음과 같 NHibernate.그것은 많이 포함되어 있는 개념을 확인 저장소에서 유용(지도 Id,캐시,쿼리를 개체..)

에서도 DDD,나는 유 데이터 액세스 클래스고 루틴에서 별도체.

이유는,

  1. 테스트 용이성을 향상시킵
  2. 문제의 분리 및 모듈 디자인
  3. 더 많은 유지 보수에 추가로 엔티티,루틴

전문가는 생각하지 않지만,다만 제 생각입니다.

성가신 일 닐슨의 적용 DDD&P 는 그가 항상을 시작으로"나는 그렇게 하지 않겠소에서 실시-세계-응용 프로그램 하지만..."그리고 그의 예는 다음과 같습니다.다시 항목:나는 생각 OrderRepository.GetOrdersByCustomer(고객)이 방법을 간다,그러나 거기에는 또한 토론에서 ALT.Net 메일링 리스트(http://tech.groups.yahoo.com/group/altdotnet/ 행)에 대한 DDD.

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