Ho IWindsorContaner che esiste per l'intera durata dell'applicazione. Per Unittests è possibile registrare mock/stubs, ecc. Sotto il loro Type. Quando il test è terminato e l'apparecchiatura viene smaltita, i componenti registrati nel test vengono rimossi con un metodo creato automaticamente chiamato "Unregister".Come vengono rimossi i componenti con Castle 3.0?
Ora, voglio aggiornare l'ultima versione di Castle che è 3.0. Secondo la versione 3.0 Note di qualcosa come
public void Unregister(string contextName, string registrationName)
{
IWindsorContainer context = GetOrCreateContext(contextName);
context.Kernel.RemoveComponent(registrationName);
}
non è più possibile, perché il metodo IKernel.RemoveComponent è stato rimosso. La descrizione per risolvere questo problema non è veramente sufficiente ("Prova a utilizzare IHandlerSelectors.").
Una versione semplificata del dispositivo che uso per Unittests:
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()));
}
}
Come posso rimuovere componenti con Castle 3.0?
Naturalmente funzionerebbe. Ma questo richiederebbe anche molte modifiche al codice in molti progetti di software dipendenti. Ho trovato una soluzione con il mettere un oggetto titolare al contenitore invece di quello reale. Ma più ci penso, Castle non sembra essere il giusto contenitore IoC per le unittests, vero? – Antineutrino
Per tutti i test unitari che ho scritto a questo punto, Castle è stato esattamente il contenitore IoC perfetto per i test unitari. Perché hai comunque bisogno di cancellare tutte le entità registrate? – eouw0o83hf
Poiché ogni test di unità registra i propri mock. Se non vengono rimossi, il prossimo test unitario userebbe i mock sbagliati. Quindi c'è il codice nel metodo IDisposable.Dispose del dispositivo di test Ioc che rimuove tutti i componenti. – Antineutrino