Где поставить аудит или логи? - PullRequest
4 голосов
/ 16 апреля 2009

В настоящее время я работаю над проектом ASP.NET MVC с использованием NHibernate, и мне нужно отслеживать изменения в некоторых объектах, чтобы иметь возможность создавать отчеты и запросы к данным. По этой причине я хотел, чтобы данные были в таблице, но я пытаюсь решить, куда «зацепить» код аудита.

На слое NHibernate:

  • PRO: мощная система событий для отслеживания любых изменений
  • PRO: Ничто не может быть изменено в приложении без уведомления (если кто-то не использует сырой SQL ...)
  • CON: Поскольку у меня есть общий репозиторий ... тогда я должен отфильтровать полезные объекты (мне не нужно отслеживать все).
  • CON: у меня нет простого доступа к контроллеру и действиям, поэтому я могу отслеживать только основные операции (обновление, удаление ...). Я могу получить HttpContext по крайней мере, чтобы получить некоторую информацию.

В фильтре действий на уровне контроллера:

  • PRO: Полная информация о запросе и статусе веб-приложения. Таким образом, я могу отличить «изменение» от «изменения статуса» и быть более информативным в информации аудита.
  • CON: Кто-то может забыть фильтр, и важные действия могут быть предприняты без уведомления, что является большим недостатком.

Есть подсказка?

Обновление : см. Создание журнала аудита с использованием событий NHibernate .

Ответы [ 3 ]

4 голосов
/ 16 апреля 2009

Я думаю, что делать это на уровне хранилища гораздо лучше. Главным образом потому, что вы можете в будущем решить добавить какой-либо метод доступа к вашему хранилищу, который не проходит через MVC (например, интерфейс WCF к данным).

Таким образом, возникает вопрос, как вы решите проблемы, которые вы перечислили в отношении этого слоя NHibernate?

Отфильтровать полезные объекты достаточно просто. Я, вероятно, сделал бы это через пользовательский атрибут типа объекта. Вы можете пометить объекты, которые вы хотите отслеживать, или те, которые вы не хотите; что проще.

Выяснить, что на самом деле задумал контроллер, сложнее. Я собираюсь оспорить, что вы можете "получить HttpContext"; Я не думаю, что это хорошая идея сделать это в хранилище, потому что разделение интересов. Репозиторий не должен зависеть от Интернета. Одним из методов будет создание пользовательских методов в хранилище для действий, которые вы хотите отслеживать по-разному; это особенно привлекательно, если есть другие аспекты этих правок, которые ведут себя по-разному, такие как разная безопасность. Другой метод состоит в том, чтобы исследовать изменения, сравнивая старую и новую версии объектов и выявляя фактический характер изменений. Третий метод заключается в том, чтобы не пытаться определить природу изменения, а просто сохранить версии до и после в журнале, чтобы человек, который читает журнал, мог сам разобраться в этом.

1 голос
/ 16 апреля 2009

Я делаю это с помощью NHibernate. Объекты, которые требуют аудита, реализуют интерфейс IAudtable, и я использую Interceptor, чтобы выполнить аудит для любого объекта, который реализует IAuditable, перехватывая OnFlushDirty, OnDelete и OnSave.

1 голос
/ 16 апреля 2009

Я бы предпочел поместить его в слой данных (NHibernate в вашем случае). Если поместить его в контроллер и попросить других людей (или себя в будущем) внедрить контроллеры, то это противоречит принципам объектно-ориентированного проектирования.

...