2016-11-08 1 views
0

après avoir lu this et this je viens près de la solution mais pas à la fin puisque je ne sais pas comment appliquer à ma mise en œuvre.Nhibernate envers, utiliser l'injection de dépendance pour ajouter l'utilisateur dans l'entité de révision

i ont cette entité de révision custon et listner de révision:

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

et ceci est mon 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; 
    }  
} 
problème de base

est de savoir comment faire une injection de travail revisionListner:

public EnversRevisionListener(IUserManagement um) 

EDIT:

continuer à travailler je vois la vraie quête: private static void InitializeSessionFactory: puisqu'il est statique, il n'y a aucun moyen d'y injecter des références. doit trouver autre façon

Répondre

0

portage résolu l'injection de dépendance dans UnitOfWork Classe:

public class UnitOfWork: IUnitOfWork { objet private static readonly _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(); 
      } 
     } 
    } 

puis usine de session:

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