2012-02-29 43 views
8

我有IWindsorContaner存在整個應用程序的生命週期。對於Unittests,可以在其Type中註冊mocks/stub等。當測試完成並且夾具被放置後,測試中的註冊組件將被刪除,並且會自動創建一個名爲「取消註冊」的方法。如何用Castle 3.0刪除組件?

現在,我想更新到最新的城堡版本是3.0。按照3.0發行說明像

public void Unregister(string contextName, string registrationName) 
{ 
    IWindsorContainer context = GetOrCreateContext(contextName); 
    context.Kernel.RemoveComponent(registrationName); 
} 

是不可能的了,因爲IKernel.RemoveComponent方法已被刪除。解決這個問題的描述並不足夠(「嘗試使用IHandlerSelectors」)。

我使用的單元測試夾具的簡化版本:

public sealed class DependencyInjectionFixture : IDisposable 
{ 
    private Stack<Type> registeredTypes = new Stack<Type>(); 

    // Registering of mocks/stubs, etc 
    public void RegisterSingleton<T>(T singleton, string objectName) 
    { 
    registeredTypes.Push(typeof(T)); 

    IWindsorContainer context = GetOrCreateContext(contextName); 

    context.Register(Component.For(typeof(T)) 
           .Named(objectName) 
           .Instance(singleton) 
           .LifeStyle.Singleton); 
    } 

    // Called when tests ends 
    public void Dispose() 
    { 
    IWindsorContainer context = GetOrCreateContext(contextName); 

    while (registeredTypes.Count > 0) 
     context.Kernel.RemoveComponent(CSApplicationContext.GetRegistrationNameFor(registeredTypes.Pop())); 
    } 

}

如何刪除組件與城堡3.0嗎?

回答

2

而不是試圖刪除所有組件,只需創建一個新的IWindsorContainer並將其綁定到任何GetOrCreateContext正在檢查。然後你會有一個新的容器,沒有任何約束。

+2

當然這會奏效。但是這也需要很多依賴軟件項目的代碼更改。我找到了一個解決方案,將持有者對象放在容器中,而不是真正的容器。但是,我認爲更多的是Castle看起來並不是真正的IoC集裝箱測試集裝箱,是嗎? – Antineutrino 2012-03-12 17:39:33

+0

對於我寫到這一點的所有單元測試,Castle已經成爲單元測試的完美IoC容器。爲什麼你需要清除所有註冊的實體? – eouw0o83hf 2012-03-13 14:30:09

+1

因爲每個單元測試都會註冊自己的模擬。如果他們沒有被刪除,那麼下一個單元測試會使用錯誤的模擬。因此,Ioc測試夾具的IDisposable.Dispose方法中的代碼將刪除所有組件。 – Antineutrino 2012-03-19 18:29:27