2010-07-12 3 views

ответ

1

я был дан awnser коллегой

public class NHibernateMessageModule : IMessageModule 
{ 
    /// <summary> 
    /// Injected SessionManager. 
    /// </summary> 
    public ISessionManager SessionManager { get; set; } 

    public void HandleBeginMessage() 
    { 
     //this session need for NServiceBus and for us 
     ThreadStaticSessionContext.Bind(SessionManager.OpenSession()); //CurrentSessionContext or ThreadStaticSessionContext 
    } 

    public void HandleEndMessage() 
    { 
     SessionManager.Session.Flush(); 
    } 

    public void HandleError() 
    { 
    } 
} 

общедоступный интерфейс ISessionManager { ISession Session {получить; } ISession OpenSession(); bool IsSessionOpened {get; } void CloseSession(); }

класс NHibernateSessionManager общественности: ISessionManager { частное ISessionFactory _sessionFactory; частное ISession _session;

public ISession Session 
    { 
     get { return _session; } 
     private set { _session = value; } 
    } 

    public SchemaExport SchemaExport { get; set; } 


    public NHibernateSessionManager(ISessionFactory sessionFactory) 
    { 
     _sessionFactory = sessionFactory; 
    } 

    public bool IsSessionOpened 
    { 
     get { return Session != null && Session.IsOpen; } 
    } 

    public ISession OpenSession() 
    { 
     if(Session == null) 
     { 
      Session = _sessionFactory.OpenSession(); 
      if (SchemaExport != null) 
       SchemaExport.Execute(true, true, false, Session.Connection, null); 
     } 
     return Session; 
    } 

    public void CloseSession() 
    { 
     if (Session != null && Session.IsOpen) 
     { 
      Session.Flush(); 
      Session.Close(); 
     } 
     Session = null; 
    } 
} 
+0

wont они вводят странные любопытные замки в вашей системе? – Baz1nga

0

Вы делаете то же самое, что и в упомянутом вами артикле, но выбираете один из автокадров Autofac. Если у вас есть другие классы, связанные с обработкой сообщений, где вы хотите, чтобы ваш сеанс, который будет введен, вы используете InstancePerLifetimeScope как это

public class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher, IWantCustomInitialization 
{ 

    public void Init() 
    { 
     var builder = new ContainerBuilder(); 
     builder.Register(s => SessionFactory.CreateSessionFactory()).As<ISessionFactory>().SingleInstance(); 
     builder.Register(x => x.Resolve<ISessionFactory>().OpenSession()).As<ISession>().InstancePerLifetimeScope(); 

     var container = builder.Build(); 
     Configure.With().AutofacBuilder(container); 
    } 

} 

Вы также можете зарегистрировать любую другую зависимость, необходимую в вашем контексте NSB, и вы будете уверены, что это инстанцируется и дозируется должным образом из-за использования детского контейнера.

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