【问题标题】:Nhibernate envers, use dependency injection to add user into revision entityNhibernate envers,使用依赖注入将用户添加到修订实体中
【发布时间】:2016-11-08 09:36:02
【问题描述】:

在阅读 thisthis 之后,我接近了解决方案,但还没有结束,因为我错过了如何应用到我的实施。

我有这个自定义修订实体和修订列表:

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:因为它是静态的,所以无法在其中注入引用。必须找到不同的方式

【问题讨论】:

    标签: c# nhibernate ninject nhibernate-envers


    【解决方案1】:

    解决了将依赖注入移植到 UnitOfWork 类中:

    公共类 UnitOfWork : IUnitOfWork { 私有静态只读对象 _syncRoot = new object();

        private ITransaction _transaction;
        private SessionFactory _nhHelper;
        internal ISession _session;
        public UnitOfWork(SessionFactory sf)
        {
            //Contract.Ensures(_session.IsOpen);
            _nhHelper = sf;
            InizializzaSessione();
        }
        public void InizializzaSessione()
        {
            lock (_syncRoot)
            {
                if (_session == null || _session.IsOpen == false)
                {
                    _session = _nhHelper.OpenSession();
                }
            }
        }
    

    然后是会话工厂:

    public class SessionFactory : IDisposable
    {
    
        private static ISessionFactory _sessionFactory;
        private static NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();       
    
        static readonly object factorylock = new object();
        IUserManagement um; 
    
        public SessionFactory(IUserManagement ium)
        {
            um = ium;
        }
    
        private static void InitializeSessionFactory(IUserManagement um, bool genereteDB = false)
        {
            _sessionFactory = Fluently.Configure()
                    .Database(MsSqlConfiguration.MsSql2008
                    .ConnectionString(c => c.FromAppSetting("FluentNHibernateConnection"))
                    .ShowSql())
                    .Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())
                                                    .Conventions.AddFromAssemblyOf<SessionFactory>()
                            )
                       .ExposeConfiguration(config => SetupEnvers(config, um))                     
                       .ExposeConfiguration(config => new SchemaUpdate(config).Execute(false, true))
                    .BuildSessionFactory();
        }
    
        private static void SetupEnvers(NHibernate.Cfg.Configuration cfg, IUserManagement um)
        {
            try
            {
                var enversConf = new NHibernate.Envers.Configuration.Fluent.FluentConfiguration();
    
                IRevisionListener revListner = new EnversRevisionListener(um);
                enversConf.SetRevisionEntity<RevisionEntity>(e => e.Id, e => e.RevisionDate, revListner);
             }
            catch (Exception ex)
            {
                throw ex;
            }
    
        }
    
        internal ISession OpenSession()
        {
            lock (factorylock)
            {
                if (_sessionFactory == null)
                {
                    InitializeSessionFactory(um);
                }
            }
            NHibernate.ISession session = _sessionFactory.OpenSession();
    
            return session;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多