用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;
        }
    }

 

posted @ 2017-04-21 20:20  yxlq  阅读(972)  评论(0编辑  收藏  举报