2012-06-03 2 views
1

도메인 간 개발 전문가에게 ...이 도메인 기반 디자인입니까?

저는 DDD의 개념을 정말로 파악하려고합니다. 지금까지 저는 도메인 구동보다는 데이터 구동을위한 모델을 설계했습니다. DDD에 관한 몇 가지 기사를 읽었으며 특히 큰 규모의 응용 프로그램에서 특히 흥미로운 것 같았습니다. 그래서 나는 정확하게하기 위해 나의 모델을 맞추려고 노력하고있다.

모든 고객 계정을 사용할 수 없게하는 메소드 FreezeAccounts를 표시하는 고객 엔티티를 말하고 있습니다. 이 방법은 데이터 접근과 관련이 없습니다 (Persistence Ignorance 규칙 기반). 필요에 따라로드되는 각 고객 계정의 플래그를 업데이트하고 변경 사항을 데이터베이스에 저장합니다. 이 모델을 기반으로 올바른가요? DDD에서 반드시 테이블 엔티티 당 하나의 클래스 만있는 것은 아닙니다. 이 기능은 별도의 클래스에 있어야합니까? 엔티티에 그래서 CRUD 작업을 모두

public class Customer : ICustomer, ICustomerAction 
{ 
    #region Initialization 
    public Customer() 
    { 
    } 

    internal Customer(ICustomer view) 
    { 
     this.CustomerId = view.CustomerId; 
     this.Name = view.Name; 
     this.Email = view.Email; 
     this.IsActive = view.IsActive; 
    } 
    #endregion 

    #region Instances 

    private AccountCollection _accounts; 

    #endregion 

    #region Properties 

    #region ICustomer 

    public int CustomerId { get; private set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 

    #endregion 

    #region Derived 

    public AccountCollection Accounts 
    { 
     get 
     { 
      if (_accounts == null) 
       _accounts = Account.GetListByCustomerId(CustomerId); 
      return _accounts; 
     } 
    } 

    #endregion 

    #endregion 

    #region Methods 

    #region CRUD 

    // Data Access Object accepts interface ICustomer 
    internal void Update() 
    { 
     CustomerDb.Update(this); 
    } 

    #endregion 

    #region ICustomerAction 

    // Exposed business Persistence Ignorance action 
    internal void FreezeAccounts() 
    { 
     foreach (Account account in this.Accounts) 
     { 
      account.IsEnabled = false; 
      account.Update(); 
     } 
    } 

    #endregion 

    #endregion 
} 
+1

이제 모든 것이 명확합니다. 내 사례는 DDD가 아닌 기존의 Active Record Pattern을 따르고있었습니다. 응용 프로그램 서비스가 리포지토리와 도메인 (서비스/엔터티)과 상호 작용하는 대신 비즈니스 개체가 리포지토리와 상호 작용하고있었습니다. 키워드 : Unit Of Work, Entity 뿌리 및 서비스는 그림을 지우는 데 도움이되었습니다. 감사! – fips

+0

그럼 왜 옳은 대답을 받아들이지 않았 니? :-) – inf3rno

답변

2

첫째, DDD에서의 데이터 액세스 레이어 도메인과 비즈니스 로직에서 분리해야하는 다른 아키텍처에서와 같은 : 여기에 몇 가지 예제 코드입니다 .

그렇다면 스토리지에서 데이터를 읽고 쓰는 데 별도의 계층 (클래스는 아님)을 작성하십시오. 특히 DDD에서는 Martin Fowler가 RepositoryUnit Of Work 패턴을 사용할 수 있습니다.

DDD의 예를 보려면 here을 원합니다.

참고 : NuGet에서 내 DDD 아키텍처 "보기"의 ​​새로운 개정판을 게시했습니다.

+0

지적 해 주셔서 감사합니다. 완전히 별도의 데이터 액세스 레이어에 동의했습니다. CustomerDb.Update는 데이터 액세스에 사용되는 다른 클래스 (DAL)이며, Customer 클래스 (BLL 내부)는 형식의 매개 변수를 수락하는 메서드 "Update"만 호출 할 수 있도록 ADO.NET/LINQ (인터페이스를 사용하여 쉽게 플러그 가능)에서 전달하는 매개 변수입니다. 고객. 일반적으로 사용되는 레이어, MVC, 세션 Facade, BLL 및 DAL 및 유닛 테스트에 대한 자체 코드 생성기를 작성했습니다. 내 관심은 실제로 데이터 중심 아키텍처와 도메인 중심 아키텍처 간의 차이를 이해하고 있습니다. 흥미로운 기사, 당신의 개정판을 기대합니다. – fips

-1

DDD를 사용하면 엔티티 (고유 한 ID가 있고 개별 단위로 유지됨), 엔티티 루트 (외부 세계에 노출하려는 엔티티)가 무엇인지 명확히 이해하고 싶습니다. , 서비스 (엔티티 간의 상호 작용을 관리하는 코드) 란 무엇입니까?

DB에서 항목을 유지하는 방법은 엔티티 개체와 완전히 다를 수 있습니다. 그러나 엔티티 만 처리하면 바깥 세상이 걱정할 필요가 없으므로 DAL로 추상화됩니다.

예를 들어 인터페이스 (I SOLID)에 프로그래밍을 잘 활용하고 있지만 이는 시스템의 의도를 모른 채이 샘플이 DDD를 따르고 있는지 여부를 말하기 어렵습니다.