0

단위를 관리 할 수있는 "MyUnits"응용 프로그램이 있습니다 (예 : 미터, 킬로그램, 파운드, 마일, km/h ...). 모델이 복잡하고 단위 호환성, 작업, 변환 등을 지원합니다.DDD with webservices 값 객체로 DTO : 어떻게 처리할까요?

"단위"를 사용해야하는 다른 응용 프로그램 (MyApp)이 있으므로 "단위"응용 프로그램을 사용하고 싶습니다. .

제가 생각하기에 단위 DTO UnitDTO을 소비하고 반환하는 "단위"서비스 (웹 서비스) UnitService이 있어야합니다.

Operand 
    value: float 
    unit: UnitDTO 
OperationAdd 
    operand1: Operand 
    operand2: Operand 
    execute() 

문제 : MyApp를에서

,이 모델이 OperationAdd.execute()에, 나는 단위 (예를 들어) 호환되는지 확인해야합니다. 그러니

는 :

  • UnitDTOUnitService::areCompatible를 호출하는 방법이 있지만, 그것은 잘못입니다! DTO (데이터 만 포함해야 함)가 webservice 인 UnitService를 어떻게 알 수 있습니까! 하지 않아야합니다

  • OperationAdd.execute()UnitService::areCompatible으로 전화를 걸면됩니다. OperationAdd (엔티티)가 웹 서비스 인 UnitService를 아는 방법! 그것은

  • 안 또는 내가 일을하는 OperationService이 (그 서비스를 호출 할 수 있습니다) 을하지만Operation 실체가없는 방법과 데이터 컨테이너, 엔티티처럼 될 것이며, 그 DDD는 약 정말 무엇

빈혈 엔티티는 원하지 않지만 서비스를 사용하는 엔티티가있는 경우 어떻게해야합니까?

그리고 UnitDTO가 VO로 사용될 수 있다고 생각 하나?

답변

0

단위는 호환성을 "광고"해야합니다. 나는 당신이 사용하는 언어가 generics를 지원하는지 모르지만 나는 이렇게 할 것입니다.

우선 UnitDto에는 일부 Unit의 상태가 포함됩니다. UniDto를 사용하여 구체적인 단위 (btw는 VO 임)를 만듭니다. 각 단위는 호환성을 알아야합니다 .UnitDTO는 DTO 일 뿐이고 작업을 수행 할 다른 VO를 생성해야합니다.

C 번호

public class UnitBase 
{ 
    public virtual bool IsCompatible(UnitBase unit) 
    { 
     return false; 
    } 
} 

public interface ICompatible<T> 
{ 
    bool IsCompatible(T unit); 
} 
public class UnitFeet {} 
public class UnitMeter:UnitBase,ICompatible<UnitFeet> 
{ 
    bool IsCompatible(UnitFeet unit) { return true;} 
} 
public override bool IsCompatible(UnitBase unit) 
{ 
    return IsCompatible((UnitFeet)unit); 

} 

는 컴파일러는 비교 수단에 따라 권리의 과부하를 선택한다. 또한 ICompatbile 인터페이스는 한 장치에서 다른 장치로 변환 방법을 가질 수 있습니다. 그러나의 당신이

public class OperandValue:ICompatbile<OperandValue> 
{ 
    public decimal Value {get;set;} 
    public UnitBase Unit {get;set;} 
    public bool IsCompatbile(OperandValue other) 
    { 
     return Unit.IsCompatbile(other.Unit); 
    } 

    public static OperandValue FromDto(Operand data) 
     { 
     return new OperandValue(data.Value,UnitBase.FromDto(data.Unit)); 
     } 
} 

OperandValue first=OperandValue.FromDto(operand1); 
OperandValue second=OperandValue.FromDto(operand2); 

if (first.IsCompatbile(second)){ 
    OperationService.Add(first,second) 
    } 

그래서 당신이 UnitService :: AreCompatbile 방법, 다형성 및주의 대상 디자인의 단지 많이 필요하지 않은 일을 더 추상적한다고 가정하자.

+0

나는 "Units"앱의 엔티티입니다. 데이터베이스에 저장되어 있습니다.단위 간 변환 수 (km, m, mile, foot, ...)가 있습니다. 그래서 webservice는 단위 엔티티에 접근하기 위해 단위 DTO를 제공합니다. 그래서 다른 응용 프로그램에서 DTO를 VO로 사용하는 것은 잘못된 것입니다 ... –

+0

혼란스러워 보이지만 네, DTO를 VO로 사용해서는 안됩니다. 다른 목적 – MikeSW

관련 문제