подсказка для подхода журнала аудита - PullRequest
3 голосов
/ 24 июня 2009

В настоящее время я занимаюсь разработкой системы управления персоналом ASP.NET. Я использую многоуровневую архитектуру с Web Client Software Factory, которая основана на шаблоне MVP. ORM является NHibernate. И мне нужно реализовать модуль журнала аудита. Я много читал о разных подходах. Большинство из них описывают, как отслеживать дату, timastamp и личность человека, который внес это изменение, но никто не мог сказать мне об этом: как отслеживать изменения какого-либо свойства в слое моего домена? Мне не нужна возможность отката, мне нужно только войти с: кто, когда и какое свойство того объекта было изменено, старое значение и новое значение этого свойства.

Я не могу решить, куда поместить обработчик этих изменений. Фаулер указал метод установки свойств в журнале аудита, но я все еще хочу, чтобы классы моего домена были простыми POCO. Может быть, есть какой-то другой подход?

Ответы [ 4 ]

2 голосов
/ 26 июня 2009

Я должен был сделать это несколько лет назад и для системы управления персоналом. Я сделал это, когда все мои «поля» реализовали шаблон (универсальный):

Вот пример шаблона, который я сделал урезанным:

class DataField<T>
{
    public T Current { get; set; }
    public T Original { get; set; }
    // stores the field name as a nice textual readable representation.
    // would default to property name if not defined.
    public string FieldName { get; set; }
    public bool Modified
    {
        get { return !(Current.Equals(Original));
    }

    public DataField(T value)
    {
        Original = Current = value;
    }

    public DataField(T value, T fieldName)
    {
        Original = Current = value;
        FieldName = fieldName;
    }
}

Интересная часть, которая упростила аудит, заключалась в том, что каждый объект мог создавать свой собственный журнал аудита. Я мог бы взять любой объект, который мог бы иметь х число этих «полей», и вызвать GetAudit, и он вернул бы мне объект аудита со всеми изменениями в классе, показывающими имя поля, старое значение, новое значение и т. Д. Каждый DataField реализует метод для возврата объекта аудита. Для строк, double, ints и т. Д. Он был в значительной степени запечен, но если вы использовали пользовательские объекты, вы могли бы написать реализацию аудита для них, которая просто должна была возвращать объект Audit.

Таким образом, в типичной форме в конце я буду хранить все данные в одном объекте, который имеет все эти типы полей. Затем я сделал бы обновление и вызвал бы метод GetAudit, который также был бы записан в таблицу аудита.

Я легко могу сказать, изменилось ли что-нибудь в форме, даже если им пришлось пройти через несколько страниц и т. Д.

Отменить операции было очень легко на поле за полем, за разделом или за весь уровень объекта.

Немного запутано в точных деталях, так как я долгое время не касался кода, но в этом была его суть. Надеюсь, это поможет.

0 голосов
/ 25 июня 2009

Вы уже извлекли Блок приложения для ведения журналов из библиотеки Microsoft Enterprise?

0 голосов
/ 25 июня 2009

Либо вам нужно хранить исходные данные в вашем объекте, либо извлекать их из базы данных для регистрации перед обновлением.

Я видел, как это реализовано на уровне данных, в хранимых процедурах или триггерах, но никогда на уровне домена.

Редактировать: Пример из двух частей использования триггеров базы данных для регистрации истории находится здесь: http://www.4guysfromrolla.com/webtech/041807-1.shtml Кажется, есть много хороших дискуссий о плюсах / минусах этой техники. Надеюсь, это поможет.

0 голосов
/ 25 июня 2009

Возможно, вы сможете реализовать шаблон наблюдателя, так как .net реализует этот шаблон неявно (с событиями), я думаю, что не будет большой добавленной стоимости.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...