Вопрос

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

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

Это было полезно?

Решение

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

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

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, который также был бы записан в таблицу аудита.

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

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

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

Другие советы

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

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

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

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

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

Проверяли ли вы ведение журнала приложений Microsoft Корпоративная библиотека?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top