orm (IPostUpdateEventListener, IPostInsertEventListener, IPostDeleteEventListener)에 감사 기능을 추가했습니다. 잘 작동합니다. 문제는 데이터베이스에 대한 요청이 다른 추가 정보와 함께 수행 된 사용자 이름과 IP 주소를 기록하고 싶다는 것입니다.
웹, ORM 및 공유의 3 개 모듈이 있습니다. 웹-> 공유 <-ORM. 웹은 Shared에있는 인터페이스를 통해 ORM에 액세스합니다. 요청에 대한 정보를 더 추가하려면 어떻게해야합니까? (또는 정확히 nhibernate 세션) 그래서 이벤트 리스너 코드에서 호출 할 수 있습니다.
감사 :)
여기 내 청취자의 예가 있습니다. NHibernate Cookbook에 배치 된 것과 거의 동일합니다. HttpContext 또는 WindowsIdentity에서 사용자 이름을 가져 오는 메서드가 있습니다. 웹에서 항상 호출 할 것이라는 것을 알고 있다면 항상 HttpContext.Current를 정의해야합니다. 거기에서 원하는 정보를 얻으십시오. 그 요청에 대한 액세스 권한을 제공해야합니다.
public class EventListener : IPreInsertEventListener, IPreUpdateEventListener
{
private readonly IStamper _stamper;
public EventListener() : this(new Stamper()) { }
public EventListener(IStamper stamper)
{
_stamper = stamper;
}
#region IPreInsertEventListener Members
public bool OnPreInsert(PreInsertEvent @event)
{
_stamper.Insert(@event.Entity as IStampedEntity, @event.State, @event.Persister);
return false;
}
#endregion
#region IPreUpdateEventListener Members
public bool OnPreUpdate(PreUpdateEvent @event)
{
_stamper.Update(@event.Entity as IStampedEntity, @event.OldState, @event.State, @event.Persister);
return false;
}
#endregion
}
public interface IStamper
{
void Insert(IStampedEntity entity, object[] state, IEntityPersister persister);
void Update(IStampedEntity entity, object[] oldState, object[] state, IEntityPersister persister);
}
public class Stamper : IStamper
{
private const String CreateUser = "CreateUser";
private const String CreateDate = "CreateDate";
private const String LastUpdateUser = "LastUpdateUser";
private const String LastUpdateDate = "LastUpdateDate";
public void Insert(IStampedEntity entity, object[] state, IEntityPersister persister)
{
if (entity == null)
return;
SetCreate(entity, state, persister);
SetChange(entity, state, persister);
}
public void Update(IStampedEntity entity, object[] oldState, object[] state, IEntityPersister persister)
{
if (entity == null)
return;
SetChange(entity, state, persister);
}
private void SetCreate(IStampedEntity entity, object[] state, IEntityPersister persister)
{
entity.CreateUser = GetUserName();
SetState(persister, state, CreateUser, entity.CreateUser);
entity.CreateDate = DateTime.UtcNow;
SetState(persister, state, CreateDate, entity.CreateDate);
}
private void SetChange(IStampedEntity entity, object[] state, IEntityPersister persister)
{
entity.LastUpdateUser = GetUserName();
SetState(persister, state, LastUpdateUser, entity.LastUpdateUser);
entity.LastUpdateDate = DateTime.UtcNow;
SetState(persister, state, LastUpdateDate, entity.LastUpdateDate);
}
private void SetState(IEntityPersister persister, IList<object> state, String propertyName, object value)
{
var index = GetIndex(persister, propertyName);
if (index == -1)
return;
state[index] = value;
}
private Int32 GetIndex(IEntityPersister persister, String propertyName)
{
return Array.IndexOf(persister.PropertyNames, propertyName);
}
private String GetUserName()
{
if (HttpContext.Current != null)
return HttpContext.Current.User.Identity.Name;
var windowsIdentity = WindowsIdentity.GetCurrent();
return windowsIdentity != null ? windowsIdentity.Name : String.Empty;
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다