簡體   English   中英

在 WinForm 應用程序中與溫莎城堡關閉 NHibernate session

[英]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 消耗。

你為什么不嘗試使用攔截器呢?

http://kozmic.pl/2010/03/11/advanced-castle-windsor-ndash-generic-typed-factories-auto-release-and-more

我不喜歡這么多的方法來保持對容器的 static 引用...我建議您避免直接調用 Resolve/Release...您應該在一開始就連接所有內容並讓組件相互調用

http://fabiomaulo.blogspot.com/2009/11/guywire.html

假設從您的示例中,您有一個主要的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM