2

これこれを読んだ後、私は解決策に近づきましたが、実装に適用する方法を見逃しているため、最後までではありません。

私はこのカスタムリビジョンエンティティとリビジョンリスナーを持っています:

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静的であるため、参照を挿入する方法はありません。別の方法を見つける必要があります

4

1 に答える 1