2016-11-08 42 views
0

閱讀thisthis後,我接近解決方案,但沒有到最後,因爲我想如何適用於我的實施。Nhibernate envers,使用依賴注入將用戶添加到修訂實體

我有這個custon修訂實體和修訂聽者:

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:因爲它是靜態的,所以沒有辦法在其中注入引用。必須找到不同的方式

回答

0

解決移植依賴注入的UnitOfWork類:

公共類的UnitOfWork:IUnitOfWork { 私人靜態只讀對象_syncRoot =新的對象();

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; 
    } 
}