2016-10-27 18 views
1

我試圖理解一個有點複雜的場景。基本上,如果我有一個在城堡註冊爲LifestyleTransient()X使用PerWebRequest組件的瞬態組件,PerWebRequest組件何時超出作用域?

Component.For<IX>() 
.ImplementedBy<X>() 
.LifestyleTransient() 

X看起來像:

public X : IX 
{ 
    private IY _y; 
    public X(IY y) 
    { 
     _y = y; 
    } 
    .... 
} 

Y因此註冊:

Component.For<IY>() 
.ImplementedBy<Y>() 
.LifestylePerWebRequest() 

,看起來像:

public Y : IY, IDisposable 
{ 
    private Object obj; 
    public Y() 
    { 
     obj = new Object(); 
    } 

    public void Dispose() 
    { 
     obj.Dispose(); 
    } 
} 

如果我創建的X實例Release它:

WindsorContainer Container; 
IX x = Container.Resolve<IX>(); 
Container.Release(x); 

什麼時候Dispose得到所謂的Y?它是在Web請求的末尾還是x的實例被釋放? Dispose會被叫到嗎?!


注:這是一個有點converluted例子,我實際的例子是更爲複雜,invloves一個MVC的ControllerFactory和其他各種部件的技術,但問題相當歸結爲以上這simpliest形式。

回答

1

隨着實驗位時出現以下情況:

  • Dispose()將調用
  • Dispose被稱爲在web請求結束
  • 如果多個瞬態X s的創建和發佈Dispose只有 (在Y上)調用一次在網絡請求結束時。不是在瞬態容器對象被釋放

注意事項

我已經調試Dispose法等我假設我調試這並沒有作出任何影響就得出了這個結論這是如何執行的。我還沒有找到任何有關如何工作的確鑿文件,並歡迎任何人找到這個問題?

我的實現是問題略有不同,這一點,我猜溫莎需要知道,如果接口爲IDispoable或沒有,所以IY樣子:

interface IY : IDisposable 

我沒有,如果這測試是相關的(如果沒有損壞,不要修復)。