Закройте сессию NHibernate в приложении WinForm с Виндзорским замком - PullRequest
0 голосов
/ 26 мая 2011

Мое приложение WinForm настроено так:

 public class RepositoriesInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(AllTypes.FromAssemblyContaining<EventRepository>()
          .BasedOn(typeof(IRepository<>))
          .WithService.AllInterfaces()
          .Configure(c => c.LifeStyle.Transient));
    }
}

Program.cs

   FrmStart form1 = CastleContainer.Resolve<FrmStart>();

Я внедряю класс репозитория в мои формы, но я должен быть уверен, что сеанс NHibernate будетзакрыто, когда я закрою форму.Это правильный путь для его устранения?

   public class EventRepository : IRepository<Event>,IDisposable
{
    private readonly ISession session;

    public EventRepository(ISession session)
    {
        this.session = session;
    }

    public void Dispose()
    {
        session.Close();
    }

update

Является ли этот код действительным?

 private void button1_Click(object sender, EventArgs e)
    {
        FrmStart form1 = CastleContainer.Resolve<FrmStart>();
        form1.FormClosed += new FormClosedEventHandler(form1_FormClosed);
        form1.Show();

    }
    void form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        CastleContainer.Instance.Release(sender);
    }

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Windsor поддерживает интерфейс IDisposable и должен автоматически вызывать Dispose при освобождении компонента.

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

1 голос
/ 04 июня 2011

при условии, что из вашего примера у вас есть основной frm (frmMain) и дополнительный (frm1), который вы хотели бы показать при нажатии одной кнопки. Вы, конечно, должны поместить их все в контейнер среди их зависимостей, чем пользовательский интерфейсКонструктор root = frmMain будет выглядеть как

public partial class frmMain : Form
{
    frm1 _frm1Instance
    public frmMain(frm1 frm1Instance)
    {
      _frm1Instance = frm1Instance;
      //...
    }

        private void button1_Click(object sender, EventArgs e)
        {
            _fmr1Instance.Show();

        }
}

в Guywire среди методов Wire и DeWire. Например, у вас будет такой метод, как

public System.Windows.Forms.Form GetRoot()
{
    return container.Resolve<frmMain>();
}

, чем у основного метода,вы создадите экземпляр Guywire и будете использовать форму, возвращаемую GetRoot (), чтобы запустить ваше приложение

Если вы решите пойти по этому пути, вы не сможете использовать frm1 при закрытии, иначе при следующей кнопке button1 вы нажметеЯ попытаюсь получить доступ к дипозированному объекту.

Если вам действительно нужно ввести дозу frm1, я предлагаю вам ввести TypedFactory (WindsorFacility) вместо экземпляра frm1, получить экземпляр через фабрику и также ввести через фабрику.см .: http://mookid.dk/oncode/archives/1854

1 голос
/ 03 июня 2011

Почему бы вам не попробовать вместо этого использовать интерцептор?

http://kozmic.pl/2010/03/11/advanced-castle-windsor-ndash-generic-typed-factories-auto-release-and-more

Мне не нравится такой подход к сохранению статической ссылки на контейнер ... Я предлагаю вам избегать прямого вызова Resolve / Release ... Вы должны подключить все в самом начале и иметь компоненты, вызывающие друг друга

http://fabiomaulo.blogspot.com/2009/11/guywire.html

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