2010-03-05 5 views
5

В моем приложении у меня есть ситуация, когда нам нужно зафиксировать, когда запись была создана и изменена, и что пользователь выполнил эти действия. Таким образом, у меня мог бы быть объект:Какова наилучшая практика для настройки последних изменений и кто изменил использование NHibernate?

public class Product 
{ 
    int Id; 
    int Name; 
    DateTime CreatedOn; 
    int CreatedByUserId; 
    DateTime LastModifiedOn; 
    int LastModifiedByUserId; 
} 

Какова наилучшая практика для обработки данных в NHibernate? С помощью перехватчика что-то вроде описанного here?

ответ

1

Я не думаю, что существует «лучшая» практика, но использование прослушивателей событий является более распространенным явлением для этого. Хороший пример можно найти в http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx

Одна вещь, которую вам нужно учитывать, это то, что вам нужно хранить этот userId где-то. В настоящее время я делаю это, назначая статическое свойство в слушателе при запуске. Это некрасиво, но он выполняет свою работу.

+0

Как-то я подумал, что это будет ответ :) Думаю, я действительно не искал «лучших», но «рекомендовал» –

+0

Мы делаем что-то подобное, но передаем 'Func ' нашему «аудитору». Для тестирования мы просто возвращаем фиксированное значение, и в процессе производства мы передаем функцию, которая вызывает «HttpContext.Current.User» –

+0

@Diego Mijelshon Yuck, которая уродливая ... к сожалению, я думаю, что мне придется делать то же самое! – richard

0

Я согласен с Диего, что я не думаю, что есть лучшая практика. Это зависит от вашего контекста приложения. В ссылке Диего и для прослушивания событий на уровне персистентности (nHibernate) необходимо знать, как искать текущего пользователя. Это может не иметь смысла в зависимости от вашего приложения. Например, если вы пишете приложение ASP.NET MVC, действительно ли вы хотите, чтобы ваш уровень персистентности зависел от HttpContext, чтобы узнать пользователя? Да, вы могли бы перейти к какой-то стратегии, но это не похоже, что это всегда будет правильно.

Я думаю, что это вполне справедливо, если бы ваш сервисный уровень создавал объект и добавлял самого создателя. Затем передайте весь объект, с создателем, уже увлажненным, до nHibernate для продолжения. Создатель будет сохранен в базе данных так же, как и любое другое свойство.

+0

Мое приложение (ASP.NET MVC) структурировано с использованием репозиториев, и поэтому передача информации о пользователе будет интересной. Я определенно не хочу, чтобы у РЕПО была прямая ссылка на HttpContext, поэтому мне нужно будет найти способ передать эту информацию в хранилищах элегантно. –

+0

Вы можете разработать стратегию; создать своего рода ICurrentUserProvider и передать это с уровня контроллера/службы. ICurrentUserProvier будет иметь делегат, указывающий на метод, который использует HttpContext для разрешения текущего пользователя. Тем не менее, это по-прежнему является нарушением DIP, и его следует избегать, если это возможно. – manu08

+0

Я использую IoC для ввода пользователя в случае необходимости, что-то вроде этого в autofac: builder.Register (c => HttpContext.Current.User) .HttpRequestScoped(); – UpTheCreek