Реализация аудиторского следа для объектов в C#?

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

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

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

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

5 ответов


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

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

Это можно заткнуть внутри и заткнуть когда мы любим.

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

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

надеюсь, что это помогает..


вы можете реализовать что-то похожее на 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; }
}

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

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


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

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

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


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

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

примечание: Я владелец