One solution will use a selector
public class ForcedImplementationSelector<TService> : IHandlerSelector { private static Dictionary<Type, Type> _forcedImplementation = new Dictionary<Type, Type>(); public static void ForceTo<T>() where T: TService { _forcedImplementation[typeof(TService)] = typeof(T); } public static void ClearForce() { _forcedImplementation[typeof(TService)] = null; } public bool HasOpinionAbout(string key, Type service) { return service == typeof (TService); } public IHandler SelectHandler(string key, Type service, IHandler[] handlers) { var tService = typeof(TService); if (_forcedImplementation.ContainsKey(tService) && _forcedImplementation[tService] != null) { return handlers.FirstOrDefault(handler => handler.ComponentModel.Implementation == _forcedImplementation[tService]); }
Testing and use
[TestFixture] public class Test { [Test] public void ForceImplementation() { var container = new WindsorContainer(); container.Register(Component.For<IFoo>().ImplementedBy<Foo>()); container.Register(Component.For<IFoo>().ImplementedBy<Bar>()); container.Kernel.AddHandlerSelector(new ForcedImplementationSelector<IFoo>()); var i = container.Resolve<IFoo>(); Assert.AreEqual(typeof(Foo), i.GetType()); ForcedImplementationSelector<IFoo>.ForceTo<Bar>(); i = container.Resolve<IFoo>(); Assert.AreEqual(typeof(Bar), i.GetType()); ForcedImplementationSelector<IFoo>.ClearForce(); i = container.Resolve<IFoo>(); Assert.AreEqual(typeof(Foo), i.GetType()); } }
source share