Отслеживание изменений, внесенных в класс без использования Entity Framework - PullRequest
0 голосов
/ 05 сентября 2018

Мне нужно отслеживать любые изменения, внесенные в сложную модель (я должен сказать, что очень сложная модель со всеми видами отношений). После того, как я определил эти изменения, я должен сохранить их в отдельной таблице, чтобы администратор утвердил их на более позднем этапе.

Я пытался использовать трекер изменений Entity Framework и даже пытался настроить его, но он только давал мне проблему за проблемой.

Что, по вашему мнению, я мог бы использовать для отслеживания этих изменений, что не касается Entity Framework?


ОБНОВЛЕНИЕ: я решил эту проблему, создав собственную программу проверки. Потребовалось больше времени, но в итоге это стоило того, так как я полностью контролировал изменения.

Спасибо за ваши мнения,

Стив:)

1 Ответ

0 голосов
/ 05 сентября 2018

Извините за отсутствие примера кода. Как уже отмечалось, это скорее идея (в широком смысле для этого Exchange), но это способ высокого уровня, который я делал раньше. В те времена, когда «рефлексия» вызывала неодобрение, мы называли ее «метаданными», но по существу использовали рефлексию - и по этой причине сегодня она известна как метапрограммирование.

Ваша проблема, прекрасный пример использования метапрограммирования . Отражение раньше было очень медленным в 80-х годах только из-за нехватки памяти и ограниченной загрузки процессора.

  • Сериализации, такие как JSON, используют отражение или позорно медленный XML (но не больше)
  • Внедрение зависимостей - мать метапрограммирования
  • Такие помощники, как auto mapper, тоже в основном рефлексия.

Сегодня он был высоко оптимизирован и отлично работает благодаря превосходной вычислительной мощности. Пока вы не пишете хакерский код или не пытаетесь его оптимизировать, все будет в порядке. Для этого вам следует довериться фреймворку и компиляторам.

Вы можете делать некоторые причудливые вещи, такие как перехват изменений, но это может быть довольно сложным. Чтобы сделать его немного проще, все, что вам нужно сделать, это следовать немного DDD

Ваши классы должны позволять изменения только через те свойства, которые вы выставляете. Каждому набору или операции, изменяющим состояние, можно затем отправить свой прекрасный код отслеживания состояния.

в NET 4.5 действительно быстрое отражение, и метапрограммирование уже используется в Dependency Injection на протяжении всего шоу.

Чтобы запомнить изменения, используйте оптимизированную коллекцию, например, Словарь или HashSet. Зависит от ваших потребностей. Используя GetType, сохраните его в качестве ключа, и значением может быть новое значение или класс, содержащий метаданные. Старое значение, Новое значение, Версия (для отката) и т. Д. И т. Д.

Как только вы начнете это делать в своем классе, вы затем переместите всю логику в синглтон и определите некоторые общие методы, которые вы будете повторно использовать на всех ваших "сущностях"

...