В нашем многоуровневом бизнес-приложении у нас есть ObservableCollections
самопроверяющихся сущностей, которые возвращаются из сервисных вызовов.
Идея в том, что мы хотим иметь возможность получать объекты, добавлять, обновлять и удалять их со стороны клиента сбора, а затем отправлять эти изменения на стороне сервера, где они будут сохраняться в базе данных.
Само-отслеживающиеся сущности, как можно предположить по их названию, сами отслеживают свое состояние.
Когда создается новый STE, он имеет состояние «Добавлено», когда вы изменяете свойство, он устанавливает состояние «Изменено», он также может иметь состояние «Удалено», но это состояние не устанавливается, когда объект удаляется из ObservableCollection
(очевидно) , Если вам нужно такое поведение, вам нужно написать его самостоятельно.
В моей текущей реализации, когда сущность удаляется из ObservableCollection
, я сохраняю ее в теневой коллекции, так что когда ObservableCollection
отправляется обратно на сервер, я могу отправлять удаленные элементы вместе, поэтому Entity Framework знает, как их удалить.
Что-то вроде:
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 сможет пролить свет на лучшее решение.
EDIT:
В конце концов я решил пойти с подклассами ObservableCollection
. Код служебного прокси-сервера генерируется, поэтому его было довольно просто изменить, чтобы он возвращал мой производный тип.
Спасибо за помощь!