Аудит доменной модели
От: Alkersan  
Дата: 25.06.09 13:03
Оценка:
В данный момент разрабатываю систему для Human Resources на ASP.NET. Как платформу использую Web Client Software Factory, для доступа к данным — NHibernate. Появилось требование — реализовать историю изменеий объектов домена. Но не просто кто и когда менял последним запись о сотруднике, а детально, какие поля какого объекта, кем, когда менялись. Много перечитал но к решению так и не пришел.
В каком слое лучше реализовать такой функционал, и как приблизительно должно выглядеть такое решение?

Я выделяю 2 сценария: создание business entity и дальнейшее ее редактирование. Допустим удалять в системе ничего нельзя (информация вечная).
В какой момент лучше делать запись в лог? Фаулер описывал подход когда сами объекты в setter свойствах вызывали Логер. Но это как-то коряво, и не логично — доменным объектам должно быть все равно, есть ли аудит или нет.

Может лучше с помощью какого-то атрибута над свойствами? Но тогда куда передавать сообщение о том что я (свойство) изменилось? Какой шаблон лучше для этого использовать?

Кто-то мне предлагал перед апдейтом сравнивать первоначальное состояние объекта с текущим при помощи рефлексии, и список изменений заносить в лог. Но прохоить по дереву полей объекта каждый раз при обновлении — это наверно долго. Хотелось бы чтобы изменения заносились в какое-то хранилище, типа транзакции, именно в момент изменеий, но вот как именно такое организовать?
Re: Аудит доменной модели
От: baranovda Российская Империя  
Дата: 25.06.09 13:20
Оценка: +1
Здравствуйте, Alkersan, Вы писали:

A>В каком слое лучше реализовать такой функционал, и как приблизительно должно выглядеть такое решение?


Сейчас модно группировать операции над сущностями в сервисах, а аудит подключать декларативно, задействуя интерсепторы-перехватчики вызовов методов сервисов. См. PostSharp (интерсепторы подключаются на этапе компиляции) или Unity (умеет, например, выполнять перехват виртуальных вызовов)
Re: Аудит доменной модели
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.06.09 13:27
Оценка:
Здравствуйте, Alkersan, Вы писали:

A>Кто-то мне предлагал перед апдейтом сравнивать первоначальное состояние объекта с текущим при помощи рефлексии, и список изменений заносить в лог. Но прохоить по дереву полей объекта каждый раз при обновлении — это наверно долго. Хотелось бы чтобы изменения заносились в какое-то хранилище, типа транзакции, именно в момент изменеий, но вот как именно такое организовать?

Это в принципе правильный вариант. Незнаю как NHibernate, а из EF можно вытащить список измененных полей объекта. Вероятне всего и в хибернейте есть такая возможность

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

Кстати имеет смысл посмотреть в сторону sharepoint, там есть как аудит, так и версионирование записей.
Re[2]: Аудит доменной модели
От: Alkersan  
Дата: 25.06.09 13:41
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Кстати имеет смысл посмотреть в сторону sharepoint, там есть как аудит, так и версионирование записей.

На шерпоинт смотреть не стоит, т.к. система строится как раз для того, чтобы отказаться от шерпоинта
Re[2]: Аудит доменной модели
От: Alkersan  
Дата: 25.06.09 14:02
Оценка:
B> Ааудит подключать декларативно, задействуя интерсепторы-перехватчики вызовов методов сервисов
Можно детальнее описать такой подход? Я смотрел быстрый старт PostSharp, они создали там атрибут, который пишет в трейс информацию том какой метод выполняется. Т.е. можно также написать атрибут, который будет вызывать Логер, когда вызывается setter какой-то проперти?
Re[3]: Аудит доменной модели
От: baranovda Российская Империя  
Дата: 25.06.09 14:26
Оценка:
Здравствуйте, Alkersan, Вы писали:

A>Т.е. можно также написать атрибут, который будет вызывать Логер, когда вызывается setter какой-то проперти?


Да, конечно.

Статья про перехват в Unity тут:

Using Interception with Unity

Играя директивами компилятора, можно легко переключаться с одного способа перехвата на другой.
Re[3]: Аудит доменной модели
От: baranovda Российская Империя  
Дата: 25.06.09 14:29
Оценка:
Здравствуйте, Alkersan, Вы писали:

A>выполняется. Т.е. можно также написать атрибут, который будет вызывать Логер, когда вызывается setter какой-то проперти?


Сорри, недочитал. С пропертями сложнее, да и нужно ли на каждый чих вызывать логгер? Ведь изменение свойств сущностей обычно накапливают в модели, а потом производят транзакционное обновление.
Re[4]: Аудит доменной модели
От: Alkersan  
Дата: 25.06.09 15:19
Оценка:
B>Изменение свойств сущностей накапливают в модели, а потом производят транзакционное обновление.

Накопление изменений реализовано в NHibernate, он точно реализует шаблон UnitOfWork, но я не знаю как извлечь список измененний в текущей сессии. Может кто-то знает?
Re[3]: Аудит доменной модели
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 25.06.09 16:22
Оценка:
Здравствуйте, Alkersan, Вы писали:

A>На шерпоинт смотреть не стоит, т.к. система строится как раз для того, чтобы отказаться от шерпоинта


А зачем, если не секрет? NIH-синдром? Или есть более веские причины?
[КУ] оккупировала армия.
Re[4]: Аудит доменной модели
От: Alkersan  
Дата: 26.06.09 06:37
Оценка:
K> NIH-синдром? Или есть более веские причины?
Нет, никакого синдрома. Просто, как мне кажется, даже на мощном шерпоинте трудно реализовать весь функционал бизнесс системы. Шерпоинт — это по сути портал с контентом. В этом плане он очень удобен, и как центральный информационный ресурс компании он и используется. Но когда доменная модель со своими приколами — то тут надо писать все руками.
Re[5]: Аудит доменной модели
От: Ziaw Россия  
Дата: 26.06.09 08:40
Оценка:
Здравствуйте, Alkersan, Вы писали:

B>>Изменение свойств сущностей накапливают в модели, а потом производят транзакционное обновление.


A>Накопление изменений реализовано в NHibernate, он точно реализует шаблон UnitOfWork, но я не знаю как извлечь список измененний в текущей сессии. Может кто-то знает?


http://elegantcode.com/2008/05/15/implementing-nhibernate-interceptors/
... << RSDN@Home 1.2.0 alpha 4 rev. 1228>>
Re[5]: Аудит доменной модели
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 26.06.09 16:43
Оценка:
Здравствуйте, Alkersan, Вы писали:

K>> NIH-синдром? Или есть более веские причины?

A>Нет, никакого синдрома. Просто, как мне кажется, даже на мощном шерпоинте трудно реализовать весь функционал бизнесс системы. Шерпоинт — это по сути портал с контентом. В этом плане он очень удобен, и как центральный информационный ресурс компании он и используется. Но когда доменная модель со своими приколами — то тут надо писать все руками.

Ну если изначально взялись за "доменную модель", то SP вам будет только мешать. Но не факт что такая модель нужна в HR.
Re: Аудит доменной модели
От: meowth  
Дата: 27.06.09 12:22
Оценка:
Здравствуйте, Alkersan, Вы писали:

A>В данный момент разрабатываю систему для Human Resources на ASP.NET. Как платформу использую Web Client Software Factory, для доступа к данным — NHibernate. Появилось требование — реализовать историю изменеий объектов домена. Но не просто кто и когда менял последним запись о сотруднике, а детально, какие поля какого объекта, кем, когда менялись. Много перечитал но к решению так и не пришел.

A>В каком слое лучше реализовать такой функционал, и как приблизительно должно выглядеть такое решение?

Если вам не нужно потом будет использовать эту накопленную историю как-то хитро в предметной области, то решение такое:
— реализовать в отдельном, отвязанном от логики, facility (history & audit facility, H&aF );
— к NHibernate подключить interceptor'ы (штатная возможность), которые и будут оповещать H&aF об изменении данных.

Если история будет вплетена в домен, то и H&aF нужно размещать тесно с остальной логикой; вероятно, можно обойтись и без перехватчиков уровня ORM.
Re: Аудит доменной модели
От: alex_angel  
Дата: 30.06.09 19:31
Оценка:
Здравствуйте, Alkersan, Вы писали:

A>В данный момент разрабатываю систему для Human Resources на ASP.NET. Как платформу использую Web Client Software Factory, для доступа к данным — NHibernate. Появилось требование — реализовать историю изменеий объектов домена. Но не просто кто и когда менял последним запись о сотруднике, а детально, какие поля какого объекта, кем, когда менялись. Много перечитал но к решению так и не пришел.

A>В каком слое лучше реализовать такой функционал, и как приблизительно должно выглядеть такое решение?



Здравствуйте. Насколько я понял — вопрос о реализации версионности. По этой ссылке описан очень понятный механизм. В конце есть ссылка на пдфку с более детальным описанием.
http://software.intel.com/ru-ru/blogs/2009/03/09/2000727/

Если будут вопросы — обращайся, объясню детали если что
Re[2]: Аудит доменной модели
От: baranovda Российская Империя  
Дата: 30.06.09 19:41
Оценка:
Здравствуйте, alex_angel, Вы писали:

_>Если будут вопросы — обращайся, объясню детали если что


Лучше про архитектуру регистров 1С v8 почитать. Паттерн тот же, а концепция на порядок стройнее и понятнее.
Re[2]: Аудит доменной модели
От: Alkersan  
Дата: 02.07.09 16:03
Оценка:
_>вопрос о реализации версионности. По этой ссылке описан очень понятный механизм

В моем случае скорее не версионность, а аудит изменений. Нужен самый простой механизм, когда не нужны откаты. Просто чтобы велся лог какие поля каких доменных объектов были изменены, кем и когда, желательно с возможностью гибкой настройки полей поддающихся аудиту(но это уже не столь важно, возможно в будущих версиях). Есть корневой объект — Сотрудник. В нем есть множество всязанных классов — контакты, телефоны, адреса, отпуска и т.д.
Re[3]: Аудит доменной модели
От: Аноним  
Дата: 02.07.09 19:06
Оценка:
Здравствуйте, Alkersan, Вы писали:

_>>вопрос о реализации версионности. По этой ссылке описан очень понятный механизм


A>В моем случае скорее не версионность, а аудит изменений. Нужен самый простой механизм, когда не нужны откаты. Просто чтобы велся лог какие поля каких доменных объектов были изменены, кем и когда, желательно с возможностью гибкой настройки полей поддающихся аудиту(но это уже не столь важно, возможно в будущих версиях). Есть корневой объект — Сотрудник. В нем есть множество всязанных классов — контакты, телефоны, адреса, отпуска и т.д.


Да-да, именно аудит в данной схеме и описан.
Возможность откатить изменения — это вовсе не главное и имплементация заняла буквально пару строк кода и один юнит-тест
Re[3]: Аудит доменной модели
От: Alkersan  
Дата: 03.07.09 10:56
Оценка:
B>Лучше про архитектуру регистров 1С v8 почитать. Паттерн тот же, а концепция на порядок стройнее и понятнее.

Регистры восьмой 1С очень мощная вещь, вот только врядли существует документация о том как оно реализовано.
Re[4]: Аудит доменной модели
От: baranovda Российская Империя  
Дата: 03.07.09 11:09
Оценка:
Здравствуйте, Alkersan, Вы писали:

A>Регистры восьмой 1С очень мощная вещь, вот только врядли существует документация о том как оно реализовано.


Купите электронную книжку СМС-кой, 25 рублей всего:
http://www.online.1c.ru/books/book/3761717/
Re[5]: Аудит доменной модели
От: Alkersan  
Дата: 03.07.09 11:59
Оценка:
B>Купите электронную книжку СМС-кой, 25 рублей всего:
B>http://www.online.1c.ru/books/book/3761717/

Нашел в офисе такую книгу, пролистал, но ничего по архитектуре регистров не нашел."На примере создания реального прикладного решения показана структура различных объектов системы". Фактически описано программирование мышкой

То, что существуют отличные системы аудита, я знаю. Мне не нужна такая функиональность как в 1С. Вопрос изначально был такой: какой эффективный шаблон стот применять для ведения истории изменеий доменной модели, при использовании NHibernate и слоёной архитектуры веб приложения.

Ну реверс-инжиниринг 1С предприятия, конечно, тоже решение .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.