集約ルートと子エンティティを持つドメイン駆動設計を使用しています。
集約不変条件は、集約ルートConfigurableService
メソッドを介して強制され、子エンティティのメソッドに連鎖し、グループ間の要件をマップするリストGroups
を使用します。Dependencies
不変の例の 1 つConfigurableService
は、SkuId がリスト内のいずれかのグループに含まれている場合にのみ、依存関係を作成できるようにすることです。
私が行ってグループまたは依存関係を公開すると(mongodbが永続性を必要とするため)、このドメインロジックをバイパスできます-したがって、以下のようなエンティティメソッドを呼び出すパブリックプロパティでクラスを展開できると考えましたDependencies
およびGroups
プロパティ:
public class ConfigurableService
{
List<Groups> groups = new List<Groups>();
Dependencies dependencies = new Dependencies();
public void AddDependency(SkuId on, SkuId requires)
{
if(IsContainsSku(on) && IsContainsSku(requires))
this.dependencies.SetRequiresFor(on, requires);
else
throw new Exception("SkuId doesnt exist");
}
public bool IsContainsSku(SkuId sku)
{
foreach(var group in groups)
{
if(group.ContainsSku(sku)==true)
{
return true;
}
}
return false;
}
// other code snipped for breverity
IEnumerable<Dependency> Dependencies
{
get { return this.dependencies.GetAllDependencies(); }
set
{
foreach(var dependency in value)
{
this.AddDependency(
new SkuId(dependency.Source),
new SkuId(dependency.Target)
);
}
}
}
IEnumerable<Group> Groups
{
get { return this.groups; }
set
{
this.groups.Clear();
foreach(var group in groups)
{
this.groups.Add(group);
}
}
}
}
これはドメイン ロジックをチェックするため、永続化する必要がある内部プロパティごとに繰り返します。
これは、プロパティが正しい順序で設定されている限り、オブジェクトがビルドされたときにリポジトリから読み取るときに正常に機能します...たとえばDependencies
、例外をスローする前にグループが設定された場合 (SkuID は存在しません)。
質問
不変条件を保護し、Mongodb がドメイン エンティティ オブジェクトを永続化/取得できるようにするための推奨される方法は何ですか?
mongodb がデータベースからハイドレートするときにプロパティが設定される順序を制御できますか?
または、カスタムのシリアル化メソッドを作成するのが最善でしょうか (どうすればよいですか)?