2016-11-08 6 views
0

после чтения this и this Я подошел к решению, но не до конца, так как я пропустил, как применить к моей реализации.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) 

EDIT:

Продолжая работу, я вижу реальный квест: 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; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^