Always wrap up your third parties

Today I was working through some code refactoring when I came across my implementation of the Castle Windsor container exposed off of the Global.asax file.  I had put it there because I needed to get it initialized during Application_Start and I wanted to put it somewhere that was easy to get at from the rest of the code.  When I exposed it off of Application_Start, I did it as a property of type IWindsorContainer.

In the end I needed to be able use a different implementation of a container.  Since I'm not in control of the IWindsorContainer interface, I didn't feel comfortable creating a new implementation based on that.  Instead I created my own interface and implementation.  The implementation for the main production container is just an adapter wrapping the IWindsorContainer.  It looked something like this:

    public class WindsorDependencContainer:IDependencyContainer
    {
        private readonly IWindsorContainer _windsorContainer;

        public WindsorDependencContainer(IWindsorContainer windsorContainer)
        {
            _windsorContainer = windsorContainer;
        }

        public Interface ResolveFor<Interface>()
        {
            return _windsorContainer.Resolve<Interface>();
        }
    }

Because I'm using my own interface I could go ahead and implement another simple container and make use of it.  Maybe something like this:

    public class SimpleDependencyContainer:IDependencyContainer
    {
        private IDictionary<Type, object> _dependencies;

        public SimpleDependencyContainer():this(new Dictionary<Type, object>())
        {
        }

        public SimpleDependencyContainer(IDictionary<Type, object> dependencies)
        {
            _dependencies = dependencies;
        }

        public Interface ResolveFor<Interface>()
        {
            return (Interface) _dependencies[typeof (Interface)];
        }
    }

I went from having my code being tied to the Windsor implementation of an IoC container to having my application be able to implement any container that I desire.  I've preached and preached that you should wrap everything that you're implementing from a third party.  For some reason I forgot this time and it damn near bit me in the ass.

Why this was important to me is the subject of a future blog post.

posted @ Thursday, January 10, 2008 7:55 PM

Print

Comments on this entry:

# re: Always wrap up your third parties

Left by Tom Opgenorth at 1/11/2008 9:36 AM
Gravatar
I see you've started to dive into JP Boodhoo's Google codebase. :)

# re: Always wrap up your third parties

Left by Steven R at 1/12/2008 12:51 PM
Gravatar
"Always wrap up your third parties". Good advice, even outside of the software development world.
Comments have been closed on this topic.