用Ninject实现MVC5的IoC控制反转方法
问题:
刚接触Ninject,用MVC5试验,但网上教程多半是MVC3或MVC4的,用MVC5一直没试验成功,直到后来看到这篇文章
IoC实践--用Ninject实现MVC5的IoC控制反转方法实例
才知道,可能是自已不会用吧,反正要点就是自已控制,
1、用Ninject基本版本而不是Ninject.MVC5。就能成功。否则老是提示:ninject mvc5 Initialize(CreateKernel)报错 序列不包含任何元素之类的错误。
2、创建一个Dependency Resolver,NinjectDependencyResolver继承自IDependencyResolver接口
namespace BookShop.WebUI.Infrastructure { public class NinjectDependencyResolver : IDependencyResolver { private IKernel kernel; public NinjectDependencyResolver() { kernel = new StandardKernel(); //跟其它教程不同的是把IKernel放这儿实例化 AddBindings(); } public object GetService(Type serviceType) { return kernel.TryGet(serviceType); } public IEnumerable<object> GetServices(Type serviceType) { return kernel.GetAll(serviceType); } private void AddBindings() { //kernel.Bind<IProductRepository>().To<EFProductRepository>(); kernel.Bind<IBookRepository>().To<BookRepository>(); } }
3、在Global.asax文件里注册Dependency Resolver,使用我们自定义的NinjectDependencyResolver来替换mvc5中默认的DependencyResolver,
这样就能够让mvc5支持DI,依赖注入。
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //设置Controller工厂 //ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory()); DependencyResolver.SetResolver(new NinjectDependencyResolver()); } }
四、在Controller中面向接口编程
public class BookController : Controller { private IBookRepository repository { get; set; } public int PageSize = 4; public BookController(IBookRepository bookRepository) { this.repository = bookRepository; } // // GET: /Book/ public ActionResult List() { return View(repository.Books); } }
这种面象接口的Dependence Injection注入或Inversion Of Controlr控制反转的模式,
能够避免以后实现的要求有变化时,只需更改下面实现的类,而不用更改控制器。当然也可在注入时(NinjectDependencyResolver类中)
由其它实现该接口的实现类来取代下面的BookRepository。
public class BookRepository:IBookRepository { public IQueryable<Book> Books { get { return GetBooks().AsQueryable(); } } private static List<Book> GetBooks() { //演示数据。 List<Book> books = new List<Book>{ new Book { ID = 1, Title = "ASP.NET MVC 4 编程", Price = 52}, new Book { ID = 2, Title = "CLR Via C#", Price = 46}, new Book { ID = 3, Title = "平凡的世界", Price = 37} }; return books; } }