2012-02-29 13 views
8

Tüm uygulama ömrü boyunca mevcut olan IWindsorContaner ürünüm var. Unittests için türlerine altında alay/saplama, vb. Kayıt yapmak mümkündür. Test bittiğinde ve fikstür yerleştirildiğinde, test için kayıtlı bileşenler “Unregister” adı verilen kendiliğinden oluşturulan bir yöntemle kaldırılır.Bileşenler Kale 3.0 ile nasıl kaldırılır?

Şimdi, en son 3.0 olan Castle sürümüne güncellemek istiyorum. 3,0 açıklamasına göre IKernel.RemoveComponent yöntemi kaldırıldığı için

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

gibi bir şey, artık mümkün değildir belirtiyor. Bunu düzeltmek için yapılan açıklama gerçekten yeterli değil ("IHandlerSelectors'ı kullanmayı deneyin.").

Ben unittests için kullanmak fikstür basitleştirilmiş versiyonu:

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())); 
    } 

} Castle 3.0 ile

nasıl kaldırabilirim bileşenleri?

cevap

2

Tüm bileşenleri kaldırmaya çalışmak yerine, yeni bir IWindsorContainer oluşturun ve bunu GetOrCreateContext karşı denetlemek için yapın. O zaman ona bağlı hiçbir şey olmayan yeni bir konteynerin olacak.

+2

Elbette bu işe yarar. Ancak bu, birçok bağımlı yazılım projesinde çok fazla kod değişikliği gerektirecektir. Gerçek yerine bir tutucu nesneyi kabın içine koyarak bir çözüm buldum. Ama daha fazla düşündüğüm şey Castle, gerçekte doğru olmayan IoC konteyneri gibi görünmüyor, değil mi? – Antineutrino

+0

Bu noktaya yazmış olduğum tüm birim testleri için, Kale ünite testleri için tam olarak mükemmel IoC konteynır olmuştur. Niçin kayıtlı bütün varlıkları temizlemeniz gerekiyor? – eouw0o83hf

+1

Çünkü her birim testi kendi alaylarını kaydeder. Eğer kaldırılmazlarsa bir sonraki ünite testi yanlış alayları kullanacaktır. Yani tüm bileşenleri kaldırır Ioc test fikstürü IDisposable.Dispose yönteminde kod var. – Antineutrino