ドメインモデルのセッター
-
02-10-2019 - |
質問
ドメインモデル上のDDDセッターのコンテキストでは、コードの臭いがあります。彼らは実際にはドメインの一部ではないという単純な理由で避けるべきです。ドメインの専門家が理解し、データの変更が特定の方法を通過する可能性があるという名詞はありません。
例:
customer.StreetName = ...
customer.City = ...
それを行う正しい方法は customer.ChangeAddress
イベントなどを公開できる方法..少なくとも私の理解から、これはすべて健全な理論であり、ドメインモデルのセッターが実際に望ましくない理由を完全に理解できます。
ただし、ドメインモデルにセッターがなければ、これらのメソッドはテストがかなり難しくなります。
すべての議論を取り入れるか、リフレクションマジックを実行するか、または何らかの魔法を実行することなく、テストを作成できない場合、顧客インスタンスを実行するにはどうすればよいですか?私はバックエンドでnhibernateを使用しているので、nhibernateはすでにこれらのフィールドを入力するためにいくつかの反射魔法を行っています。
しかし、10の引数を持つCTORを持っているのは本当に悪いと感じています。
これに関するアドバイスはありますか?
挨拶ダニエル
解決
Classic(非CQRS)DDDでは、すべてのデータを考慮してオブジェクトを評価して、エンティティがアイデンティティを維持するための主要な機能に縮小されるようにすることをお勧めします。
顧客の例では、アドレスValueObjectを参照し、次のように簡単なchengeaddressメソッドを持っている必要があります。
public void ChangeAddress(Address address)
{
//Consistency rules are here
_address = address;
}
エンティティからバリューオブジェクトにできるだけ多くのロジックを移動してみてください。良い値のオブジェクトは小さくて不変であるため、それらは本質的にテスト可能です。コンストラクターを使用して、特定の状態にVOをインスタンス化して行使します(通常、別の、変換された、VOインスタンスを返すメソッドを呼び出すことにより)。
最後になりましたが、私の経験から、ドメインモデルをテストするには追加のインフラストラクチャ(リフレクションやその他のツールなど)が必要な場合、間違っている(不必要なカップリングを導入することで)間違っていると言えます。
他のヒント
試してみたいと思うかもしれません オートフィックス.
少しの反射の愛とドメインが非常にテスト可能になります:
namespace Unit{
using System;
using System.Linq.Expressions;
public static class ObjectExtensions{
public static T Set<T,TProp>(this T o,
Expression<Func<T,TProp>> field,TProp value){
var fn=((MemberExpression)field.Body).Member.Name;
o.GetType().GetProperty(fn).SetValue(o,value,null);
return o;
}
}
}
使用法:
myUberComplexObject.Set(x=>x.PropertyOfIt, newValueOfIt);
そして、少なくともそれらの「大虐殺」オブジェクトを小さなものに分割しようとする必要があります。階層を作ってみてください(ユビキタス言語に準拠していることを確認してください)。