4

私は数日前からドメインのモデリングを行っていましたが、持続性についてはまったく考えていませんでしたが、代わりにドメイン ロジックに焦点を当てていました。これで、ドメイン オブジェクトを永続化する準備が整いました。その一部には、子エンティティの 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 をいじっていますが、まだ解決策を見つけていません...

4

2 に答える 2

0

この問題の根本的な原因を見つけたと思います。おそらく、私のエンティティの多くが以下を使用して作成されたことが原因です。

protected MyClass(Guid id, string name, string description) : this()
{ .... }

public static MyClass Create(string name, string description)
{
    return new MyClass(Guid.NewGuid(), name, description);
}

逆シリアル化するとき、RavenDb/Json.net はエンティティを適切な方法で再構築できませんでした...

パブリックコンストラクターを使用するように変更すると、すべての違いが生じました。

于 2013-03-21T21:06:14.437 に答える
-1

プライベート バッキング フィールドを保持する必要がありますか? 多くの場合、自動プロパティで十分です。

public IList<VeryImportantPart> VeryImportantParts { get; protected set; }

その際、コンストラクターでリストを初期化することができます。

VeryImportantParts = new List<VeryImportantPart>();

もちろん、これはオプションですが、新しいクラスを作成して、永続化する前にすぐにリストへの追加を開始できます。Raven がクラスを逆シリアル化すると、setter を使用してデフォルトの空のリストが上書きされるため、これは最初のストアに役立ちます。

readonly逆シリアル化中にフィールドを置き換えることができなかったため、フィールドを使用することはできません。新しいリストを作成するのではなく、既存のリストを満たすコントラクト リゾルバーまたはコンバーターを作成することは可能かもしれませんが、それはかなり複雑なソリューションのように思えます。

とにかく、自動プロパティを使用すると、コードを明確にすることができます。フィールドとプロパティのどちらを使用するかの混乱が少なくなるためです。

于 2013-03-21T18:31:22.307 に答える