2014-04-22 2 views
1

나는 대형 클래식 ASP 웹 응용 프로그램을 도메인 구동 디자인의 ASP.Net MVC로 변환하는 과정에 있습니다. 내 도메인의 대부분은 DDD에 적합하지만 순수한 DDD 방식이 적절하지 않은 상황에 처해 있습니다. 예를 들어, 내 응용 프로그램의 읽기 측면은 쓰기 측면과 크게 다릅니다. 문제는 없지만 별도의 읽기 모델을 만들었고 CQRS의 단순화 된 버전을 구현했습니다 (이벤트 소싱이없고 별도의 데이터베이스가 필요 없음). 또 다른 문제는 대량 데이터베이스 작업이었습니다. 문제 없습니다. 서비스로 구현됩니다. 여기 내 현재의 곤경이있다. Google 시스템을 통해 사용자는 향후 일정에 따라 시스템을 변경할 수 있습니다. 이를 위해 유효 날짜까지 보류중인 변경 사항을 저장하는 데이터베이스 테이블이 있습니다. 발효 일에 자동화 된 작업이 실행되어 실제 데이터베이스 업데이트를 수행합니다. 업데이트 작업에는 도메인 논리가 포함될 수 있으므로 DDD에 맞고 문제가되지 않습니다. 무슨 일이 일어나고 있는지 시각화하기 위해, 여기에 보류중인 업데이 트를 처리하는 클래스입니다 :이 다양한 데이터베이스 테이블에 대한 업데이트를 처리 할 수있는 일반적인 클래스입니다 볼 수 있듯이보류중인 업데이트 모듈 - 도메인 엔터티 또는 값 개체?

public class PendingChanges 
{ 
    public int EntityID {get; set;} 
    public string FromTable {get; set;} 
    public string DetailField {get; set;} 
    public string NewValue {get; set;} 
    public DateTime EffectiveDate {get; set;} 
    public DateTime EnteredDate {get; set;} 
    public int UserID {get; set;} 
    public string UserName {get; set;} 
    public string UserArea { get; set; } 

    // Business logic and validation here? 
} 

. 기본적으로 업데이트되는 데이터베이스 열, 열이 될 새 값, 해당 열이 속한 테이블, 유효 날짜 및 일부 로깅 데이터를 저장합니다.

내 질문은 다음과 같습니다. 보류중인 업데이트를 수집하고이를 보류중인 업데이트 테이블에 저장하는 논리를 도메인 개체로 모델링해야합니까? 예를 들어 서비스와 같이 다른 방식으로 처리해야합니까?

다른 방식으로 말하면 PendingChanges 자체는 자체 도메인 논리가있는 도메인 엔터티입니까? PendingChanges에는 변경 사항이 적용되는 엔터티와는 다른 비즈니스 규칙이 있습니다. 예를 들어 UserArea를 구성하는 요소는 유효성 검사는 물론 FromTable의 합법적 인 값인 비즈니스 규칙으로 간주 될 수 있습니다.

다른 도메인 개체간에 재사용 할 수 있으므로 값 개체를 PendingChanges합니까? 그렇다면 PendingUpdatesService를 사용하는 것이 더 합리적입니까?

+1

매우 기술적으로 들리 겠지만, 지금은 간단한 솔루션 (절차 적 트랜잭션 스크립트)으로 가서 거기에서 가져 가야합니까? –

+0

PendingChanges 클래스는 응용 프로그램의 여러 부분에서 다양한 시나리오에서 사용되므로 재사용 가능성 관점에서 볼 때 순수한 절차 적 접근 방식은 최적이 아닙니다. 하이브리드 방식이 가장 적합 할 수 있습니다. –

답변

2

도메인의 일부인 db 업데이트를 수행하는 개념, 즉 데이터베이스 관리 /보고 소프트웨어를 구축하고 있습니까? PendingChanges가 도메인에 의미가있는 경우이 기술이 중요하지 않지만 엔티티 일 수 있습니다. 적절한 도메인 모델링을 얻는 것이 훨씬 더 중요합니다. PendingChanges가 앱에서 DB의 항목을 업데이트 (도메인)하는 데 사용하는 클래스 인 경우 DDD 또는 도메인과 아무 관련이 없습니다. 이는 인프라의 일부입니다. 좋은 OOP는 여전히 필요하지만 DDD 전문 용어는 여기에 없습니다.

Btw, 개체에 ID가 있으면 일반적으로 개체입니다.

+0

PendingChanges 클래스에 대한 데이터베이스 업데이트의 메커니즘은 인프라에 속합니다.하지만 클래스 자체는 어떨까요? 나는 이것이 가치 객체 또는 DTO 인쪽으로 향하고있다. 프로젝트 구조에서 어디에서 살 것인가? 그리고 데이터베이스 메소드를 어떻게 호출해야합니까? 인프라 계층에서 직접 또는 서비스 또는 인터페이스를 통해? –

+0

PendingChanges는 도메인과 아무 관련이 없으므로 Entity 또는 Value 개체인지 여부는 중요하지 않습니다. 아마도 유틸리티 클래스가되어 인프라 프로젝트 나 비슷한 프로젝트를 가질 수 있습니다. 이 접근법은 나에게 이상한 것처럼 보입니다. 나중에 백그라운드 프로세스에 의해 실행될 모델을 업데이트하는 명령을 사용 하겠지만, 이와 같은 클래스는 잘 모릅니다. 그것이 도메인의 일부가 아니라는 것이 확실합니다. – MikeSW

+0

여기에있는 것은 지연된 메시지가 포함 된 대기열 형태입니다. 이는 매우 데이터 중심적이며 핵심 도메인이 데이터베이스 관리와 관련이 없기 때문에 완전히 기술적 인 방식으로 처리해야합니다. 물론 이러한 비즈니스 규칙을 처리하면 도메인에 불일치가 생겨 도메인에서 처리 될 수있는 처리 유형이 필요할 수 있습니다. –