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強大的可擴展性
