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

 

转载于:https://www.cnblogs.com/yxlq/p/6745327.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值