現在のプロジェクトでは、DDD / オニオン アーキテクチャをますます採用しています。私がまだはっきりしていない多くのことの 1 つは、どの程度のカプセル化が必要かということです。具体例でわかりやすく説明。
例
namespace MyProject.Model
{
public class ComplexEntity
{
private int _id;
public int Id { get {return _id;} }
public ValueObjectA ValueA {get; set;}
public bool IsBool {get; set;}
public ComplexEntity(ValueObjectA a, bool isBool)
{
// Do some validation first
ValueA = a;
ValueB = b;
IsBool = isBool;
}
}
public class ValueObjectA
{
public bool IsBoolA {get; private set;}
public bool IsBoolB {get; private set;}
public ValueObjectA(bool a, bool b)
{
IsBoolA = a;
IsBoolB = b;
}
}
public Interface IComplextEntityFactory
{
// Option 1
ComplexEntity Create(
ValueObjectA a,
bool IsBool);
// Option 2
ComplexEntity Create(
bool valueABool a,
bool valueBBool b,
bool isBool);
}
}
質問
エンティティの工場については、
- 呼び出し元が値オブジェクトを構築し、それを使用して ComplexEntity を初期化することを期待しますか?
- 基本的に CLR の基本型をファクトリに渡し、エンティティを構成するすべての ValueObject を作成しますか?
私はオプション 2 に傾いていますが、それを裏付ける文献が見つからないようです。
編集 1
正直なところ、私はまだはっきりしていません。集約ルートはどうですか?
my entity が他のエンティティを参照する場合 (例: 以下)。
IComplexEntityFactory
,が必要ILessComplexEntityFactory
ですか? またはIComplexEntityAggregateFactory
、 LessComplexEntity を作成し、 ComplexEntity をインスタンス化するだけですか?- AggregateFactory ソリューションの場合、ファクトリに渡された LessComplexEntity 属性が既存の LessComplexEntity に対応する場合はどうすればよいですか? リポジトリから取得して再利用しますか? それとも、呼び出し元にエラーを返しますか?
AggregateFactory のメソッド シグネチャは何ですか?
(ValueObject a, ValueObject b)
、または(ValueObject value, LessCompelxEntity entity)
public class ComplexEntity { プライベート readonly int _id; public int Id { get { return _id;} }
public ValueObject Value {get; set;} public LessComplexEntity Entity {get; set;} public ComplexEntity(int id, ValueObject value, LessComplexEntity entity) { }
}
public class LessComplexEntity { プライベート readonly int _id; public int Id { get {return _id;} } public ValueObject 値 {get; set;} public LessComplexEntity(int id, ValuObject value) { } }