多層ビジネスアプリケーションにはObservableCollections
、サービスコールから返される自己追跡エンティティがあります。
アイデアは、エンティティを取得し、それらをコレクションクライアント側に追加、更新、および削除してから、これらの変更をサーバー側に送信して、データベースに永続化できるようにすることです。
自己追跡エンティティは、その名前が示すように、自分の状態を追跡します。新しいSTEが作成されると、追加状態になります。プロパティを変更すると、変更状態が設定されます。削除状態にすることもできますが、エンティティがObservableCollection
(明らかに)から削除されると、この状態は設定されません。この動作が必要な場合は、自分でコーディングする必要があります。
私の現在の実装では、エンティティがから削除されたObservableCollection
ときに、それをシャドウコレクションに保持します。これObservableCollection
により、がサーバーに返送されたときに、削除されたアイテムを一緒に送信できるため、EntityFrameworkはそれらを削除することを認識します。
次のようなもの:
protected IDictionary<int, IList> DeletedCollections = new Dictionary<int, IList>();
protected void SubscribeDeletionHandler<TEntity>(ObservableCollection<TEntity> collection)
{
var deletedEntities = new List<TEntity>();
DeletedCollections[collection.GetHashCode()] = deletedEntities;
collection.CollectionChanged += (o, a) =>
{
if (a.OldItems != null)
{
deletedEntities.AddRange(a.OldItems.Cast<TEntity>());
}
};
}
これで、ユーザーが変更をサーバーに保存することにした場合、削除されたアイテムのリストを取得して、それらを一緒に送信できます。
ObservableCollection<Customer> customers = MyServiceProxy.GetCustomers();
customers.RemoveAt(0);
MyServiceProxy.UpdateCustomers(customers);
この時点で、UpdateCustomers
メソッドはアイテムが削除されたかどうかをシャドウコレクションで確認し、それらをサーバー側に送信します。
これらのシャドウコレクションのライフサイクルについて考え始めるまで、このアプローチは問題なく機能します。基本的に、ObservableCollection
ガベージコレクションの場合、辞書からシャドウコレクションを削除する必要があることを知る方法はありません。
この場合、基本的に手動のメモリ管理を行う複雑なソリューションを思いつきました。私はを維持し、WeakReference
数ObservableCollection
秒ごとに参照が非アクティブであるかどうかを確認します。その場合、シャドウコレクションを削除します。
しかし、これはひどい解決策のようです...StackOverflowの集合的な天才がより良い解決策に光を当てることができることを願っています。
編集:
結局、私はサブクラス化することにしましたObservableCollection
。サービスプロキシコードが生成されるため、派生型を返すように変更するのは比較的簡単な作業でした。
すべての助けをありがとう!