MVC中两种实现DI的办法 ControllerFactory & DependencyResolver
具体请参照 。
DependencyResolver是MVC3中新增的专门用于实现DI的类。比起ControllerFactory
1.实现代码更简单,职责更清晰。
2.各种主流的IOC容器都实现了自己的IDependencyResolver,与MVC集成更容易。如果IDependencyResolver。自己实现一个也非常简单
使用spring.net实现IDependencyResolver。
public class SpringDependencyResolver : IDependencyResolver{ private IApplicationContext springContext; public SpringDependencyResolver(IApplicationContext context){ springContext = context; } public object GetService (Type serviceType){ IDictionaryEnumerator di = springContext.GetObjectsOfType(serviceType).GetEnumerator(); di.MoveNext(); try{ return di.Value; }catch(InvalidOperationException ioe){ return null; } public IEnumerable<object> GetServices(Type serviceType){ IDictionary dictionary = springContext.GetObjectsOfType(serviceType); return dictionary.Cast<object>(); } }
其他IOC容器。ninject ,autofac,Unity 都实现了自己的DependencyResolver
实现Demo
Global.asax 注意AutofacDependencyResolver和NinjectDependencyResolver
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); NinJectResolver(); //AutofacResolver(); } private void AutofacResolver() { var builder = new ContainerBuilder(); builder.RegisterType<MyService>().As<IService>(); builder.RegisterControllers(typeof(MvcApplication).Assembly); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } private void NinJectResolver() { IKernel kernel = new StandardKernel(); kernel.Bind<IService>().To<MyService>(); DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); }
分别用Ninject和Autofac实现DI。
Service:接口和实现
public interface IService { string Get(); } public class MyService :IService { public string Get() { return "Hello World"; } }
Controller
public class HomeController : Controller { private IService _service; public HomeController(IService service) { _service = service; } public ActionResult Index() { ViewBag.Message = _service.Get(); return View(); } public ActionResult About() { return View(); } }
Controller构造器注入Service。
总结:就这样非常容易的实现了DI。都要归功于MVC强大的可扩展性