永続性の無視は、通常、標準の .NET オブジェクト (または、本当に名前を付けることを主張する場合は POCO) を永続化および取得する機能として定義されます。そして、標準的な .NET オブジェクトの一見広く受け入れられている定義は次のとおりです。
「...インフラ関連の理由で何かを追加することなく、目の前のビジネス問題に集中する通常のクラス...」
ただし、NHibernate を持続性の無視を可能にするフレームワークとして説明している人々を目にしますが、それは標準の .NET オブジェクトでは動作せず、特定の設計要件に準拠する標準の .NET オブジェクトのみで動作するフレームワークです。たとえば ( source ):
- すべてのクラスにはデフォルトのコンストラクターが必要です
- クラスがアンシールされ、すべてのメンバーが仮想でない限り、一部の機能は動作しません
- Equals/GetHashCode を悪用しない限り、オブジェクト ID は正しく機能しません
(余談: 誰かが動揺する前に、ここで NHibernate を選択するつもりはありません。これは、持続性の無視を許可すると思われるフレームワークのよく引用される例にすぎません。同様の議論が、同じことを主張する他の ORM に適用できると確信しています。 .)
クラス自体には永続化フレームワーク固有の属性や基本クラスなどはありませんが、選択した永続化フレームワークでの使用を容易にするために一連の設計ガイドラインに従う必要があるため、私にとっては実際には「永続化に無知」ではありません。永続化フレームワークの要件を念頭に置いて、クラスを設計および実装する必要があります。あなたがそれを知らない場合、クラスはそれで動作しない可能性があります。
[Serializable]
「永続性の無視」/「POCO」の定義で問題を抱えているのは、概念的に、これがまたは[DataContract]
または[XmlType]
または他の永続性フレームワーク固有の注釈などの属性を追加することと実際にどのように異なるかがわからないことですそのフレームワークを使用してエンティティの永続化と取得を容易にします。
では、「持続性無知」とは一体何なのでしょうか?
明らかに、「通常のクラス」を永続化できるという定義は誤りです。なぜなら、NHibernate のクラスは、フレームワーク固有のクラスを参照しない限りは通常のクラスにすぎませんが、デフォルト コンストラクターなどの通常とは異なる設計の選択が必要なため、非常に優れているからです。 -可変型の仮想メンバーと Equals/GetHashCode の実装。
したがって、オブジェクトが持続性フレームワークの使用を (設計および構造において、またはフレームワーク固有の注釈の使用によって) 促進するが、それ自体は持続性ロジックを実行しない場合、「持続性無視」が真であると言うのは合理的ですか?