I want to isolate all my code from the IoC container library that I have chosen (Unity). To do so, I created an IContainer interface that exposes Register() and Resolve(). I created a class called UnityContainerAdapter that implements IContainer and that wraps the real container. So only the assembly where UnityContainerAdapter is defined knows about the Unity library.
I have a leak in my isolation thought. Unity searches for attributes on a type’s members to know where to inject the dependencies. Most IoC libraries I have seen also support that. The problem I have is that I want to use that feature but I don’t want my classes to have a dependency on the Unity specific attribute.
Do you have any suggestions on how to resolve this issue?
Ideally I would create my own [Dependency] attribute and use that one in my code. But I would need to tell the real container the search for my attribute instead of its own.
I found the answer: Unity uses an extension to configure what they call “selector policies”. To replace the attributes used by Unity, you just code your own version of the UnityDefaultStrategiesExtension class and register you own “selector policies” that use your own attributes.
See this post on the Unity codeplex site for details on how to do that.
I’m not sure that it’s going to be easy to do the same if I switch to another IoC library but that solves my problem for now.