我已经查看了如何在 Envers 的修订实体表中记录当前用户的用户名。但是,信息很少,而且我设法找到的信息也没有那么有用。
我有一个修订实体和侦听器,如下所示:
[RevisionEntity(typeof(EnversRevisionListener))]
public class EnversRevisionEntity : DefaultRevisionEntity
{
public virtual string UserName { get; set; }
}
public class EnversRevisionListener : IRevisionListener
{
private string _userName = "unknown";
public EnversRevisionListener(string userName)
: base()
{
_userName = userName;
}
public void NewRevision(object revisionEntity)
{
var casted = revisionEntity as EnversRevisionEntity;
if (casted != null)
{
casted.UserName = _userName;
}
}
}
我想在 ASP.NET 环境中使用这两个。配置和会话工厂创建一次,因为这是一项昂贵的操作。对于每个事务,都会打开一个新会话。
从这个NHE Jira问题和这个相关的SO 问题中,我了解到在配置 nHibernate 时可以向侦听器注册用户名。
但是,这对我来说还不够好,因为这会为每笔交易注册首先连接到应用程序的人的用户名。
我需要能够向侦听器提供与特定事务相关的用户名。
以前,我使用 nHibernate 的更新前和更新后事件侦听器使用穷人的审计。在这里,我遇到了类似的问题,因为这些侦听器也与会话工厂相关联,而不是与会话相关联。因此我切换到旧式拦截器,它可以与里面的会话相关联OpenSession
。这允许我将当前用户添加到拦截器。
但是,我不知道如何为 Envers 解决同样的问题。我希望有人能帮帮忙。