在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支持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