如何解决与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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。