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

时间:2011-05-26 10:52:14

标签: c# winforms nhibernate dependency-injection castle-windsor

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

我在表单中注入了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);
    }

3 个答案:

答案 0 :(得分:2)

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

请注意,为了正确支持退役,Windsor会保留对其创建的每个组件的引用。这就是发布组件至关重要的原因。否则你可能不得不处理增加的内存消耗。

答案 1 :(得分:1)

为什么不尝试使用拦截器?

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

答案 2 :(得分:1)

从你的例子中假设你有一个主frm(frmMain)和另外一个(frm1),你想在点击按钮上显示 你必须把所有这些都放在容器当然是它们的依赖项中,而不是UI root = frmMain contructor看起来像

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方法中的Guywire,例如,你将有一个像

这样的方法
public System.Windows.Forms.Form GetRoot()
{
    return container.Resolve<frmMain>();
}

而不是你的main方法,你将创建一个Guywire的实例,你将使用GetRoot()返回的Form来启动你的应用

如果您决定按照这种方式行事,则无法将您的frm1关闭,否则请关闭下一步按钮1单击您将尝试访问一个被丢弃的对象。

如果你真的需要dipose frm1,我建议你注入一个TypedFactory(WindsorFacility)而不是frm1实例,通过工厂获取一个实例并将它通过工厂进行操作。 见:http://mookid.dk/oncode/archives/1854