0

単位 (メートル、キログラム、ポンド、マイル、km/h など) を管理できる" MyUnits " アプリケーションがあります。モデルは複雑で、ユニットの互換性、操作、変換などをサポートしています。

「ユニット」を使用する必要がある別のアプリケーション ( MyApp ) があるので、「ユニット」アプリケーションを使用するようにします。

私が考えたのはUnitService、 Unit DTO を消費して返す "Units" サービス (webservice) を持つことUnitDTOです。

MyApp には、次のモデルがあります。

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

問題: ではOperationAdd.execute()、ユニットが互換性があることを確認する必要があります (たとえば)。

したがって、次のいずれかです。

  • UnitDTOを呼び出すメソッドがありますUnitService::areCompatibleが、それは間違っています! DTO (データのみを含む必要があります) が、Web サービスである UnitService をどのように認識しているか! すべきではない

  • OperationAdd.execute()を呼び出しますUnitService::areCompatibleが、それは間違っています! OperationAdd (エンティティ) は、Web サービスである UnitService をどのように認識しているか! すべきではない

  • または私はOperationService仕事をする(そしてそれはサービスを呼び出すことができる)を持っています、私のOperationエンティティはデータコンテナのようなものであり、メソッドのないエンティティであり、それは実際にはDDDの目的ではありません

貧血のエンティティは必要ありませんが、サービスを使用するエンティティがある場合、どうすればよいですか?

そして: UnitDTO を VO として使用できると考えるのは間違っていますか?

4

1 に答える 1

0

ユニットは、その互換性を「アドバタイズ」する必要があります。使用している言語がジェネリックをサポートしているかどうかはわかりませんが、このようにします。

まず、UnitDto には、あるユニットの状態が含まれています。UniDto を使用して具体的なユニットを作成します (これは 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 メソッドは必要ありません。多くのポリモーフィズムと注意深いオブジェクト設計だけが必要です。

于 2013-04-19T12:59:58.637 に答える