In one of my projects, I have a class that receives a data repository via a constructor injection. For a better illustration, find a simplified version of the class, the repository interface and implementation below.
namespace UnityTest { public interface IRepository { object GetEntry(int id); } }
using System; namespace UnityTest { public class Repository : IRepository { public object GetEntry(int id) { throw new NotImplementedException(); } } }
namespace UnityTest { public class MyClass { IRepository repository; public MyClass(IRepository repository) { this.repository = repository; } public void DoSomeThing() { this.repository.GetEntry(0); } } }
Pretty straight forward implementation as you can see. Injecting the actual type of the IRepository interface is now quite easy when using a programmatically approach to configure the unity container (add a reference to Unity via NuGet if not done yet).
IUnityContainer container = new UnityContainer(); container.LoadConfiguration(); var myClass = container.Resolve<MyClass>(); myClass.DoSomeThing();
While that works fine, I thought it could be a good idea to extract the container configuration into an XML file as I won't have to recompile the application to change the interface binding. And that is where the tricky part comes in. Actually I thought it couldn't be a big deal to put that into an XML file but it turned out that this is not that obvious as you might think - and as described before, there aren't that many resources out there in the net that describe this in a simple way.
So this is the simplest solution that I came up with to inject the IRepository implementation via a constructor using an XML based Unity configuration:
<configuration> <configsections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" /> </configsections> <unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> <alias alias="IRepository" type="UnityTest.IRepository, UnityTest" /> <alias alias="Repository" type="UnityTest.Repository, UnityTest" /> <container> <register mapto="Repository" type="IRepository" /> <register name="MyClass" type="UnityTest.MyClass, UnityTest"> <constructor> <param name="repository" type="IRepository"> <dependency name="IRepository" /> </param> </constructor> </register> </container> </unity> </configuration>
Hope that helps someone (at least it does help myself, should I run into that again in the future).