我的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);
}
答案 0 :(得分:2)
Windsor supports IDisposable接口,在发布组件时应自动调用Dispose。
请注意,为了正确支持退役,Windsor会保留对其创建的每个组件的引用。这就是发布组件至关重要的原因。否则你可能不得不处理增加的内存消耗。
答案 1 :(得分:1)
为什么不尝试使用拦截器?
我不喜欢这么多方法来保持对容器的静态引用...我建议你不要直接调用Resolve / Release ...你应该在最开始时连接所有内容并让组件调用彼此
答案 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