Jedno od glavnih poboljšanja koje nam MVC 3 donsi jeste bolja integracija sa IoC/DI kontejnerima. U ranijim verzijama MVC framework-a bilo je potrebno napraviti custom ControllerFactory. Međutim, postoji veliki broj IoC framework-a tako da je prirodnije da se komunikacija sa MVC framework-om odvija preko nekog interfejsa.
Za tu svrhu postoji jedan vrlo jednostavan interfejs - IDependencyResolver:
public interface IDepndencyResolver { object GetService(Type serviceType); IEnumerable<object> GetServices(Type serviceType); }
I upravo implementacije ovog interfejsa treba da delegiraju zahteve za tipovima konkretnom IoC kontejneru.
UnityDependencyResolver:
public class UnityDependencyResolver : IDependencyResolver { private readonly IUnityContainer container; public UnityDependencyResolver(IUnityContainer container) { this.container = container; } public object GetService(Type serviceType) { try { return this.container.Resolve(serviceType); } catch { return null; } public IEnumerable<object> GetServices(Type serviceType) { try { return this.container.ResolveAll(serviceType); } catch { return new List<object>(); } } }
Ovde treba obratiti pažnju na to da ukoliko GetService nije u mogućnosti da vrati servis, treba da vrati null. I slično, ukoliko GetServices ne može da vrati servise treba da vrati praznu kolekciju. Ovo je važno jer ukoliko dođe do izuzetka on će biti vraćen korisniku kao run-time greška.
Nakon sto smo implementirali IDependencyResolver interfejs, potrebno je napuniti IoC kontejner:
protected void Application_Start() { RegisterDependencyResolver(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } private void RegisterDependencyResolver() { var container = new UnityContainer() .RegisterType<IRepository, ConcreteRepository>() .RegisterType<IService, ConcreteService>(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); }