views:

51

answers:

1

I'm just starting with Windsor, so please be gentle :) I have a scenario where I want to be able to override/replace components placed inside a windsor container. Read on ...

In my prod code, I want to be able to register a component which implements a base class, and use a container to resolve the implementer. So far, using

container.Register(Component.For<LoggerBase>().ImplementedBy<DebugLogger>());

and

container.Resolve<LoggerBase>();

In my tests, I'd like to add a stub/mock implementation to override the "DebugLogger" implementation so that when my prod code calls container.Resolve<LoggerBase>(); it gets the overridden implementation.

Any pointers would be welcome!

+1  A: 

Instead of chasing down that path, you should rather use different container instances for different scenarios. Each instance could be configured differently. That's the whole point of a DI Container.

However, in general DI Containers should not be used for unit testing.

Mark Seemann
Mark, thanks for the suggestion, I hadn't thought about that approach. The only downside I guess is if I have a large number of registrations in the container and you want to override a single component. This does however provide a good solution - thanks again!
Jason Hyland
If you need multiple containers that are almost identical, you can create derived containers and then use the Template Method design pattern to override their configurations where they differ.
Mark Seemann