2009-12-10 66 views
2

我的應用程序啓動方法中有以下代碼以及 代碼來設置容器和工廠支持。工廠 方法似乎只被調用一次,而不是每次需要會話 。城堡 - 使用工廠方法和瞬態生活方式

_container.Kernel.Register(
    Component.For<ISession>().LifeStyle.Transient 
    .UsingFactoryMethod(() => 
    { 
     //Any line of code will only be hit once the first time ISession is requested. 
    })); 

我最初使用從樹幹建造1509,但更新打造1548與 相同的結果。請讓我知道,如果你需要更多的信息來幫助 我。

注:這是交叉發佈到城堡郵件列表等待批准。

注2:此代碼與windsor的最新發行版一起使用。但是,我們正在修改主幹構建,因爲我們需要變更集5927(由mausch在2009年8月13日創建)中的功能。

參見:

  1. Register Multiple Components for Single Interface Using Castle Windsor
  2. http://fisheye2.atlassian.com/changelog/castleproject/?cs=5927

回答

2

爲什麼赫克你不使用PerWebRequest一輩子此組件,或者更好的溫莎NHibernate的一體化設施?

現在回到真正的問題。

你的代碼不起作用,因爲它有錯誤。您沒有將參考存儲在當前的HttpContext中。您正在將一個引用存儲在HttpContext中,這個引用對您傳遞的委託的第一次調用是當前的。匿名委託(或包含它的匿名類)存儲對第一個HttpContext實例的引用,因此只有在請求第一次到達時,您的if條件纔會爲false。

+0

我不能使用PerWebRequest,因爲它會在應用程序啓動時使用它。我修改了這個問題,以便當我在調試器中遍歷代碼時,工廠方法中的第一行代碼僅在第一次請求ISession時纔會被觸發,而不會再次發生。這似乎是暫時的生活方式不起作用。 – beckelmw 2009-12-10 20:27:24

+0

如果您建議.UsingFactoryMethod與Lifestyle.Transient結合不起作用,那麼您就錯了。我只是在樹幹上測試它。 – 2009-12-10 21:13:46

+0

,爲什麼不使用NHibernate集成工具?我確定它可以處理應用程序啓動等情況。 – 2009-12-10 21:14:52