これとこれを読んだ後、私は解決策に近づきましたが、実装に適用する方法を見逃しているため、最後までではありません。
私はこのカスタムリビジョンエンティティとリビジョンリスナーを持っています:
public class _NHRevEntity : DefaultRevisionEntity {
public virtual int IdUtente { get; set; }
}
public class EnversRevisionListener : IRevisionListener {
private int _userName = 0;
public EnversRevisionListener(IUserManagement um) : base() {
_userName = um.UtenteCorrente.Id;
}
public void NewRevision(object revisionEntity) {
var casted = revisionEntity as _NHRevEntity;
if (casted != null) {
casted.IdUtente = _userName;
}
}
}
これが私のSessionFactoryです
public class SessionFactory : IDisposable {
private static ISessionFactory _sessionFactory;
private static NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
static readonly object factorylock = new object();
private static void InitializeSessionFactory() {
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(c => c.FromAppSetting("FluentNHibernateConnection"))
.ShowSql())
.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())
)
.ExposeConfiguration(SetupEnvers)
.ExposeConfiguration(config => new SchemaUpdate(config).Execute(false, true))
.BuildSessionFactory();
}
private static void SetupEnvers(NHibernate.Cfg.Configuration cfg) {
var enversConf = new NHibernate.Envers.Configuration.Fluent.FluentConfiguration();
enversConf.Audit<AutitedClass>();
IRevisionListener revListner = new EnversRevisionListener();
enversConf.SetRevisionEntity<_NHRevEntity>(e => e.Id, e => e.RevisionDate, revListner);
cfg.IntegrateWithEnvers(enversConf);
}
internal ISession OpenSession() {
lock (factorylock) {
if (_sessionFactory == null) {
InitializeSessionFactory();
}
}
NHibernate.ISession session = _sessionFactory.OpenSession();
return session;
}
}
コアの問題は、次のようにワークインジェクションを作成する方法ですrevisionListner
。
public EnversRevisionListener(IUserManagement um)
編集:
作業を続けていると、実際のクエストが表示されます::private static void InitializeSessionFactory
静的であるため、参照を挿入する方法はありません。別の方法を見つける必要があります