在Windsor Castle的WinForm应用程序中关闭NHibernate会话

本文关键字:NHibernate 会话 应用程序 Windsor Castle WinForm | 更新日期: 2023-09-27 17:57:40

我的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));
    }
}

程序.cs

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

我在表单中注入了Repository类,但我必须确保当我关闭表单时,NHibernate会话将关闭。这是处理它的正确途径吗?

   public class EventRepository : IRepository<Event>,IDisposable
{
    private readonly ISession session;
    public EventRepository(ISession session)
    {
        this.session = session;
    }
    public void Dispose()
    {
        session.Close();
    }

更新

这个代码有效吗?

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

在Windsor Castle的WinForm应用程序中关闭NHibernate会话

Windsor支持IDisposable接口,在发布组件时应自动调用Dispose。

请注意,为了正确支持退役,Windsor保留了它创建的每个组件的参考。这就是为什么发布组件至关重要的原因。否则,您可能不得不处理内存消耗增加的问题。

假设您的示例中有一个主frm(frmMain)和一个附加frm(frm1),您希望在某个按钮点击上显示当然,在它们的依赖关系中,你必须将所有它们都放入容器中,而UI 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();
        }
}

例如,在Wire和DeWire方法中的拉线上,你会有一个类似的方法

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

在主方法中,您将创建一个Guywire实例,并使用GetRoot()返回的Form启动您的应用

如果你决定按照这种方式操作,你就不能在关闭时处理你的frm1,否则在下一个按钮1单击时,你将尝试访问一个偶极对象。

如果你真的需要偶极frm1,我建议你注入一个TypedFactory(WindsorFacility)而不是frm1实例,通过工厂获得一个实例,并通过工厂偶极。请参阅:http://mookid.dk/oncode/archives/1854

为什么不试着使用interceptor?

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

我不太喜欢保持对容器的静态引用的方法。。。我建议您避免直接致电解决/释放。。。你应该在一开始就把所有东西都连接起来,并让组件相互调用

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