Реализация контрольного журнала для объектов в C #? - PullRequest
7 голосов
/ 30 ноября 2008

Я ищу идеи о том, как реализовать контрольные журналы для моих объектов в C #, для текущего проекта, в основном мне нужно:

1.Сохранить старые значения и новые значения данного объекта. 2. Запись создания новых объектов. 3. Удаление старого объекта.

Есть ли какой-нибудь общий способ сделать это, например, используя C # Generics, чтобы мне не приходилось писать код для событий базового объекта, таких как создание, удаление и т. Д. (Объекты ORM). Дело в том, что если есть способ внедрить контрольный журнал, если кто-то использует. У кого-нибудь есть опыт или методы, которым они следуют. Любой способ сделать это с помощью Аспектно-ориентированного (AOP) способа.

Пожалуйста, поделитесь своими идеями и т. Д.

Ответы [ 5 ]

3 голосов
/ 11 января 2009

Вы можете реализовать что-то похожее на INotifyPropertyChanged с небольшим отличием. Я извлек большую часть INotifyPropertyChanged и изменил его на общий и для хранения новых и старых значений. Тогда у вас может быть какой-то класс управления, который может прослушивать это, а onSaving и onDeleting вы можете справиться с изменениями.

public interface INotifyProperyChanged<T>
{
   event PropertyChangedEventHandler<T> PropertyChanged;
}

    public delegate void PropertyChangedEventHandler<T>(object sender,   
PropertyChangedEventArgs<T> e);

public class PropertyChangedEventArgs<T> : EventArgs
{
    private readonly string propertyName;

    public PropertyChangedEventArgs(string propertyName)
    {
        this.propertyName = propertyName
    }

    public virtual string PropertyName { get { return propertyName; } }

    public T OldValue { get; set; }
    public T NewValue { get; set; }
}
1 голос
/ 30 ноября 2008

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

Вы можете обернуть команды вокруг любой существующей структуры объекта, вы просто делегируете свои действия командному слою, а не выполняете их непосредственно над объектами.

1 голос
/ 01 декабря 2008

Рассматривали ли вы использовать простой шаблон уведомления? Вы можете сделать так, чтобы ваш сервисный уровень вызывал такие события, как NewObject, ChangedObject, DeletedObject, которые будут прослушиваться универсальным сервисным уровнем, который затем может взять объект и сохранить результаты.

Если вы хотите сохранить состояние объекта, вы можете использовать сериализацию Xml.

Другой подход доступен, если при использовании SQL Server 2008 вы можете реализовать новые функции аудита, которые позволят вам проверять изменения в записях базы данных, которые вы можете даже отслеживать (я думаю), когда данные читаются.

1 голос
/ 30 ноября 2008

Вопрос очень похож на Как реализовать контрольный журнал для ваших объектов (Программирование)?

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

Это можно подключить и отключить, когда захотим.

Однако наша реализация была в J2EE ..

Если вы действительно хотите сделать это на уровне приложения, я бы предложил это.

Надеюсь, это поможет ..

0 голосов
/ 08 ноября 2016

Довольно старый вопрос, но для тех, кто хочет проверять объекты C #, я бы порекомендовал библиотеку Audit.NET .

Имеются расширения для входа в различные системы хранения (SQL, Azure, Mongo) и для аудита различных систем (WCF, EF, MVC).

Примечание: я владелец

...