Nhibernate с формой окна - PullRequest
       1

Nhibernate с формой окна

0 голосов
/ 28 февраля 2010

У меня есть приложение asp.net с настройкой Nihbernate, теперь я хочу преобразовать его в приложение Windows Form.

Вот код, который был настроен в Global.asax.cs. Может кто-нибудь дать мне пример кода, как это сделать в форме Windows?

  protected void Application_BeginRequest(object sender, EventArgs e)
    {
        ManagedWebSessionContext.Bind(HttpContext.Current, SessionManager.SessionFactory.OpenSession());
    }

    protected void Application_EndRequest(object sender, EventArgs e)
    {
        ISession session = ManagedWebSessionContext.Unbind(HttpContext.Current, SessionManager.SessionFactory);
        if (session != null)
        {
            try
            {
                if (session.Transaction != null && session.Transaction.IsActive)
                {
                    session.Transaction.Rollback();
                }
                else
                {
                    session.Flush();
                }
            }
            finally
            {

                session.Close();
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 28 февраля 2010

Вот пример хорошо сделанного и обширного примера приложения, использующего NHibernate в настольном приложении:

Создание настольного приложения с помощью NHibernate

Управление сеансом NHibernate в настольном приложении, как правило, намного сложнее, чем управление сеансом NHibernate в веб-приложении.

1 голос
/ 28 февраля 2010

Ну, есть несколько способов доступа к ISessionFactory в приложении statefull (и настольное приложение - это приложение такого типа), среди них:

Singleton Вы можете создать фабрику сессий один раз во время запуска вашей программы и получить к ней доступ через статический одноэлементный класс. Это заставит приложение использовать только один экземпляр фабрики сеансов.

пример:

 public sealed class NHibernateHelper
 {
    private static ISessionFactory SessionFactory;
    private static readonly Configuration NhibernateConfig;
    // ....
    static NHibernateHelper()
    {
        NhibernateConfig = new Configuration().Configure();
        SessionFactory = NhibernateConfig.BuildSessionFactory();
    }

    public static ISessionFactory GetSessionFactory()
    {
        return SessionFactory;
    }
    // ....
 }

... и доступ к фабрике сеансов через метод GetSessionFactory во всем приложении.

Контекстный объект и / или внедрение зависимостей

Вы можете построить фабрику сеансов из конфигурации и передать ее через объект контекста по всему приложению.

пример:

  1. при запуске:

    // here you configure NHibernate.
    ISessionFactory _sessionFactory = BuildMySessionFactory();
    // ...
    ObjectFactory.Initialize(x =>
    {
                   x.For<IPatientRepository>()
                     .Use<StandardPatientRepository>()
                     .Ctor<ISessionFactory>().Is(_sessionFactory);
    
    // ... initialize the rest of your repositories...
    });
    
  2. , то:

    public class StandardPatientRepository : IPatientRepository
    {
        private readonly ISessionFactory _sessionFactory;
        public StandardPatientRepository(ISessionFactory sessionFactory)
        {
            if (sessionFactory == null)
                throw new ArgumentNullException("sessionFactory");
    
           _sessionFactory = sessionFactory;
        }
        public virtual Patient Get(Guid id)
        {
            using (IStatelessSession session = 
                       _sessionFactory.OpenStatelessSession())
            {
                return session.Get<Patient>(id);
            }
        }
        // the rest of data-access methods.
    }
    

тогда в ваших классах, которые будут использовать данные (т.е. использовать репозитории), вы будете использовать:

Patient = ObjectFactory.GetInstance<IPatientRepository>().Get(patient);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...