2012-01-04 9 views
4

Enversのリビジョンエンティティテーブルに現在のユーザのユーザ名を記録する方法について調べました。しかし、情報はほとんどなく、私が見つけた情報はそれほど役に立ちませんでした。NHibernate 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; 
     } 
    } 
} 

私は、これら2つのASP.NET環境内で使用したいです。高価なアクションであるため、構成およびセッション・ファクトリーは一度作成されます。トランザクションごとに、新しいセッションが開かれます。

ここからNHE Jira号とこれに関連するSO question私は、nHibernateを設定するときにユーザー名をリスナーに登録することができると私は理解します。

しかし、これは、すべてのトランザクションごとに最初にアプリケーションに接続するユーザーのユーザー名を登録するほど十分ではありません。

特定のトランザクションに関連するユーザー名をリスナーに提供する必要があります。

以前は、nHibernateの更新前および更新後のイベントリスナーを使用して、貧弱な人の監査を使用しました。ここではI faced a similar problemです。これらのリスナーは、セッションではなくセッションファクトリにも関連付けられています。したがって、古いスタイルのインターセプタに切り替えました。これは、OpenSessionのセッションに関連付けることができます。これにより、現在のユーザーをインターセプタに追加することができました。

しかし、Enversの同じ問題を解決する方法はわかりません。私は誰かが助けることを望む。

答えて

2

Thread.CurrentPrinicpalプロパティ(MSDN)を使用できます。 ASP.NETメンバーシップメカニズムは、現在ログインしているユーザーに関連付けられたIDに設定します。

+0

私の場合、 'HttpContext.Current.User'と' Thread.CurrentPrincipal'の間に違いはありますか? – Pieter

+0

私は考えていませんが、HttpContext.Userは厳密にhttp環境にバインドされています。 Thread.CurrentPrincipalはより汎用的で、winフォームアプリケーションでも動作します – Novakov

+0

私はあなたが正しいと思います。この記事によれば、どちらの値も手動で変更しないので、http://www.hanselman.com/blog/ SystemThreadingThreadCurrentPrincipalVsSystemWebbHttpContextCurrentUserOrWhyFormsAuthenticationCanBeSubtle.aspx – Pieter

関連する問題