2016-11-03 8 views
0

값 개체에 도움이 필요합니다. 다음 예제를 고려하십시오.DDD 리포지토리없이 값 개체를 처리하는 방법

팬 통화 (USD, EUR, GBP) 및 카드 유형 (Visa, Visa Electron, Mastercard)이있는 엔티티 카드가 있습니다. 나는 통화와 카드 종류가 가치 객체이고 그것이 소스 코드에 저장되어 있다고 생각한다. DDD 가치에 따르면 객체에는 저장소가 없습니다.

  1. 질문은 새 카드 엔티티를 생성 할 때 인터페이스에 통화 및 카드 유형의 드롭 다운을 채우는 방법입니다.
  2. 해당 클래스를 Application, Domain 또는 Infrastructure 레이어 에 배치하고 그 클래스에서 데이터를 검색하는 방법.

간단한 예는 "내 첫 번째 방법 만했다

갱신 1

귀중한 것 .. 내가 거기 내가 EUR의 USD의 GBP 및 몇 가지를 사용 MoneyTransfer 같은 다른 기관에서 통화를 사용하는 더 많은 열거 형을 하나 더 만들어야합니다.

public enum MoneyTransferCurrency{ 
    USD, EUR, GBP and a few other 
} 

이 방법은 제가 통화를 복제하고 payme 처리를 중지하면 nts in USD 나는 모든 enum을 찾고 USD 통화를 삭제해야한다.

+0

http://stackoverflow.com/questions/679005/how-are-value-objects-stored-in-the-database – QuietNaN

+0

"지급 처리 중지 (USD)"란 의미는 무엇입니까? 귀하의 신청서에 새로운 거래를 위해 USD가 더 이상 사용되지 않거나 USD가있는 항목을 모두 삭제해야한다는 의미입니까? USD 사용을 중단하면 저장된 데이터는 어떻게됩니까? 도메인 모델링보다 검증 문제가 더 많은 것 같습니다. 도메인 관점에서 생각해보십시오. – rascio

+0

USD로 카드를 주문할 수 없거나 USD로 송금을 보낼 수 없다는 의미입니다. 아무것도 삭제해야합니다. – Stasa

답변

1

간단한 일을 복잡하게하려고하지 마십시오.

이 VO의 가능한 모든 값을 사전에 알고 있다면 enum으로 지정할 수 있습니다.

Currency.values() 

가 자신에게 물어보세요, 얼마나 자주 이러한 값 변경 : 코드에서

public enum Currency{ 
    USD, EUR, GBP 
} 

그리고? (시스템에서 새로운 종류의 통화를 얼마나 자주 사용합니까?)
열거 형을 사용하고 프로젝트를 다시 컴파일하는 것보다 적은 비용으로 응용 프로그램을 다시 시작하지 않고도 이러한 값을 동적으로 추가 할 수있는 시스템 (예 : db 테이블)을 개발하고 유지 관리하는 비용이 있습니까? 변화가있을 때?

많은 경우 나는 "가치에 대한 설명이 필요합니다"와 같은 인수를 사용하여이 솔루션에 대해 비판했습니다. 예를 들어 EUR 값을 가질 때 "유로"를 쓰는보기와 같이 가질 수 있습니다. 설명 열.이 될 수
는 쉽게 등록 정보 파일을 사용하여 해결과 같은 :이

labels.currency.EUR=Euro 
labels.currency.USD=Dollars 

확인 :
- Loading a Value object in List or DropdownList, DDD
- Simple aggregate root and repository question

+0

의견을 보내 주셔서 감사합니다. update1을 확인하십시오. – Stasa

1

당신은 VO를 오해하고, 그들에 대한 더 많은 정보를 읽었습니다. 나는 그들을 이해하는 쉬운 방법은 Person/Addres 예제를 찾는 것이라고 생각합니다. 귀하의 경우에 대해, 불과 3 표를 작성, 복잡한 간단한 일을하려고하지 않는 어떤

: 당신은 그냥 환율 &에 cardType 테이블을 쿼리합니다 드롭 다운에 대한

Card (CardID, CurrencyID, CardTypeID) 
Currency (CurrencyID, CurrencyName) 
CardType (CardTypeID, CardTypeName) 

. 앞으로는 새로운 통화 또는 CardType을 추가하면 쉽게 할 수 있습니다.

0

CurrencyCardType 반드시 합리적인 값 객체 아니다. 가치 객체는 개념적 전체를 모델링하여 관련 속성을 포함합니다. 값 개체는 모든 특성을 비교하여 비교할 수 있습니다.

public class MonetaryValue { 

    private BigDecimal value; 
    private Currency currency; 

    public Amount(BigDecimal value, Currency currency) { 
     // validations: 
     assertNotNull(value); 
     assertNotNull(currency); 

     this.value = value; 
     this.currency = currency; 
    } 
    [...] 
} 

값 (예를 들어, 100) 및 통화 (예 : EUR)이 함께 물건의 가치에 대해 설명합니다

통화와 함께 숫자 값으로 구성되는 MonetaryValue 값 오브젝트의 예를 들어 생각해. 것은 "eur"가 아니라 "100 eur"에 불과한 "100"의 가치가 없습니다.

값 개체를 비교하는 것도 중요합니다. 화폐 가치에 대해 말할 때, 속성, 가치 및 통화를 비교할 필요가 있습니다. 100 달러가 100 유로가 아니기 때문에 화폐없이 값을 비교하면 많은 도움이되지 않습니다. 이것은 MonetaryValue이 합리적인 가치의 대상이 될 수 있음을 보여주는 또 하나의 징후입니다.