与Windsor Castle一起在WinForm应用程序中关闭NHibernate会话

问题描述

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

解决方法

假设您有一个主要的frm(frmMain)和一个附加的frm1(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方法中的Guywire上,您将拥有类似
public System.Windows.Forms.Form GetRoot()
{
    return container.Resolve<frmMain>();
}
而不是使用main方法,您将创建Guywire的实例,并使用GetRoot()返回的Form来启动您的应用 如果决定采用这种方式,则无法将frm1置于关闭状态,否则,在下一个button1单击时,您将尝试访问已分解的对象。 如果确实需要丢弃frm1,建议您注入TypedFactory(WindsorFacility)而不是frm1实例,通过工厂获取一个实例,并通过工厂对其进行处置。 参见:http://mookid.dk/oncode/archives/1854     ,Windsor支持IDisposable接口,并在释放组件时自动调用Dispose。 请注意,为了正确支持退役,Windsor保留对其创建的每个组件的引用。这就是为什么发布组件至关重要的原因。否则,您可能不得不处理增加的内存消耗。     ,您为什么不尝试使用插入器呢? 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     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...