[英]Close NHibernate session in WinForm application with Windsor Castle
我的 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>();
我在我的 forms 中注入存儲庫 class 但我必須確定 NHibernate Z21D6F40CFB511982E4424E0E 將在我關閉時關閉。7 這是處置它的正確途徑嗎?
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 保留了對其創建的每個組件的引用。 這就是為什么發布組件至關重要。 否則您可能不得不處理增加的 memory 消耗。
你為什么不嘗試使用攔截器呢?
我不喜歡這么多的方法來保持對容器的 static 引用...我建議您避免直接調用 Resolve/Release...您應該在一開始就連接所有內容並讓組件相互調用
假設從您的示例中,您有一個主要的 frm(frmMain) 和一個附加的 (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,否則在下一個按鈕 1 上單擊您將嘗試訪問已處理的 object。
如果你真的需要處理frm1,我建議你注入一個TypedFactory(WindsorFacility)而不是frm1實例,通過工廠獲取一個實例並通過工廠處理它。 見: http://mookid.dk/oncode/archives/1854
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.