6

重複の可能性:
永続性無視の利点は何ですか?

エンティティ フレームワークを理解するためにしばらく時間といくつかの質問をした後、私は永続性を無視したオブジェクトのポイントが何であるかを理解していないという結論に達しました。

私が知る限り、永続性を認識するオブジェクトと永続性を無視するオブジェクトを使用することの実際的な違いは、次のようなものに慣れることです。

Person p = Person.Load(id);
p.Active = false;
p.Save();

もう 1 つは次のように使用されます。

using (var context = new MyContext())
{
   Person p = context.Persons.Single(x => x.ID == id);
   p.Active = false;
   context.SaveChanges();
}

最初のケースでは、 を返して、後でp呼び出すことができます。Save()後者の場合、 を返すことはできますが、保存するpには new に入れる必要があります。MyContext()最初のケースでは、 Person が Load() と Save() を実際にデータベースロジックを処理するベースオブジェクトから継承すると仮定すると、永続性を変更したい場合は、そのベースオブジェクトを変更するだけです (またはIPersistentインターフェースを持つだけです)。複数のストアにアクセスするために複数の基本クラスを実装できます)。後者ではMyContext、永続化レイヤーが変更された場合にすべてのインスタンスを変更する必要があり、少しずつ行うのは非常に複雑です。

私の印象は、永続性を無視することは良いことです。理由がわかりません。セットアップ、操作、大規模な変更、断片的な変更ははるかに複雑に思えますが、その複雑さには何の利点もありません。重要な何かを見逃しているだけですか、それとも永続性を認識/無知であることの意味についての私の完全な理解に欠陥がありますか?

4

2 に答える 2

5

Persistance Ignorance is part of Seperation of Concerns. You should ask yourself, why should Person know how it should be loaded or saved? Person should deal with its own little domain.

PI means that Person doesn't care if it comes from memory, SQL, flat binary or any other means of Persistance and allows you at later point to replace your persistance layer to something else. You might initially develop your application to use flat binary files with the basic serializers to store data. Later, you might upgrade to SQL for performance reasons-- and this change is only needed in the one location whose -job- it is to handle persistance, the associated layer/component. Otherwise you must go through your entire code base to change little parts here and there that deal with persistance.

于 2012-06-18T14:01:43.427 に答える
1

あなたの例について言えば、 Person.Load(id) を書くことによって、あなたが言っている-彼の識別子を見てこのオブジェクトをロードする-あなたはIDを知っている場合にのみオブジェクトを取得できる厳格なファクトリパターンを作成しています、後でいくつかの検索条件に基づいてレコードを抽出する必要があることがわかり、ファクトリ メソッドをさらに追加しますが、2 番目のソリューションでは必要なすべての自由が既に与えられています。

2 番目のソリューションは、実行時に永続化ロジックを切り替えるのに最適です。これは、オブジェクト モデルから分離されているためです。OM をハードコーディングしたり変更したりすることなく、クライアント コード内で使用する永続化エンジンを理論的に決定できます。MyContextのすべてのインスタンスを変更する必要があるため、クライアント コードを記述して、一種のファクトリ クラスまたは依存性注入からコンテキストを受信できるようにする必要があります。

例として、次の疑似コードを使用できます。

var person = onlineDbContext.Persons.Single(x=>x.Guid == myguid);

offlineDbContext.Persons.Add(person)
offlineDbContest.SaveOrUpdate();
于 2012-06-18T14:46:58.027 に答える