私は数日前からドメインのモデリングを行っていましたが、持続性についてはまったく考えていませんでしたが、代わりにドメイン ロジックに焦点を当てていました。これで、ドメイン オブジェクトを永続化する準備が整いました。その一部には、子エンティティの IEnumerable が含まれています。RavenDb を使用すると、持続性は「簡単」ですが、オブジェクトを再度ロードすると、すべての IEnumerable が空になります。
これは、プロパティ セッターがまったくなく、代わりにバッキング フィールドとしてリストを使用しているためであることに気付きました。ドメイン集約ルートのユーザーは、コレクションに直接ではなく、パブリック メソッドを介して子エンティティを追加できます。
private readonly List<VeryImportantPart> _veryImportantParts;
public IEnumerable<VeryImportantPart> VeryImportantParts { get { return _veryImportantParts; } }
そして、追加の方法は、空想的なものではありません...
public void AddVeryImportantPart(VeryImportantPart part)
{
// some logic...
_veryImportantParts.Add(part);
}
バッキングフィールドを持つすべての IEnumerables にプライベート/保護されたセッターを追加することでこれを修正できますが、見た目は...まあ...あまりセクシーではありません。
private List<VeryImportantPart> _veryImportantParts;
public IEnumerable<VeryImportantPart> VeryImportantParts
{
get { return _veryImportantParts; }
protected set { _veryImportantParts = value.ToList(); }
}
これで、RavenDb json シリアライザーはロード時にオブジェクトを再び設定しますが、これを行うためのよりクリーンな方法がないかどうか知りたいですか?
私は JsonContractResolver をいじっていますが、まだ解決策を見つけていません...