如何使用NHibernate Envers记录当前用户

时间:2012-01-04 09:35:56

标签: asp.net-mvc nhibernate nhibernate-envers

我已经了解了如何在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 question我明白在配置nHibernate时可以向监听器注册用户名。

但是,这对我来说不够好,因为这会为每次交易注册首先连接到应用程序的用户名。

我需要能够向侦听器提供与特定事务相关的用户名。

以前,我使用nHibernate的更新前和更新后事件监听器来使用穷人的审核。这里I faced a similar problem因为这些监听器也与会话工厂相关联,而不是会话。因此我切换到旧式拦截器,它可以与OpenSession内的会话相关联。这允许我将当前用户添加到拦截器。

但是,我不知道如何为Envers解决同样的问题。我希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用Thread.CurrentPrinicpal属性(MSDN)。 ASP.NET成员资格机制将其设置为与当前登录用户相关联的标识