zoukankan      html  css  js  c++  java
  • 【ASP.NET MVC 学习笔记】- 06 在MVC中使用Ninject

    本文参考:http://www.cnblogs.com/willick/p/3299077.html

    1、在ASP.NET MVC中一个客户端请求是在特定的Controller的Action中处理的。默认情况下,MVC框架使用内置的Controller工厂类DefaultControllerFactory来创建某个请求对应的Controller的实例。有时候默认的DefaultControllerFactory不能满足我们的要求时,我们需要自定义继承自DefaultControllerFactory的Controller工厂类。在ASP.NET MVC中使用Ninject就需要自定一个这样子的工厂类。示例:

    public class NinjectControllerFactory : DefaultControllerFactory
    {
        private IKernel ninjectKernel;
    
        public NinjectControllerFactory() 
        {
            ninjectKernel = new StandardKernel();
            AddBindings();
        }
    
        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
        {
            return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType);
        }
    
        private void AddBindings()
        {
            // todo:后面再来添加绑定
        }
    }

    2、Controller工厂类创建好之后,我们需要告诉MVC框架使用我们自定义的NinjectControllerFactory来创建Controller的实例,为此我们需要在Global文件的Application_Start方法中添加以下代码:

    //设置Controller工厂
    ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

    3、在MVC中我们使用仓储模式把数据相关的逻辑和领域实体模型分离,这样对于使用者来说,通过调用仓储对象,使用者可以直接拿到自己想要的数据,而完全不必关心数据具体是如何来的。实例:

    //仓储接口
    public interface IBookRepository 
    {
        IQueryable<Book> Books { get; }
    }
    
    //接口实现
    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;
        }
    }

    4、NinjectControllerFactory 的AddBindings中添加绑定

    ninjectKernel.Bind<IBookRepository>().To<BookRepository>();

    5、列表的显示:

    public class BookController : Controller
    {
        private IBookRepository repository;
    
        public BookController(IBookRepository bookRepository)
        {
            repository = bookRepository;
        }
    
        public ViewResult List() 
        {
            return View(repository.Books);
        }
    }

    6、BookController的创建主要经过下列过程:

      (1)在Application_Start中,ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory())这段注册代码告诉MVC用NinjectControllerFactory工厂类来创建所有Controller对象。

      (2)在NinjectControllerFactory类中包含了下面两个过程:绑定接口到接口的实现和创建Controller类对象。

      (3)ninjectKernel.Bind<IBookRepository>().To<BookRepository>()这段绑定代码告诉ninjectKernel当被请求一个IBookRepository接口的实现时则返回一个BookRepository对象。

      (4)NinjectControllerFactory类中的GetControllerInstance方法,通过ninjectKernel.Get(controllerType)这句代码,ninject获取controller(如BookController)对象的信息并创建该controller的实例,这个过程会调用controller的构造函数,它会自动判断构造函数所需要的参数,如BookController类的构造函数需要一个IBookRepository接口参数,根据第2个过程ninject注册的绑定,ninject会给该构造函数传递BookRepository对象(IBookRepository接口的实现者)的引用。

  • 相关阅读:
    atitit.TokenService v3 qb1 token服务模块的设计 新特性.docx
    Atitit attilax在自然语言处理领域的成果
    Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结
    atitit。企业的价值观 员工第一 vs 客户第一.docx
    Atitit 实现java的linq 以及与stream api的比较
    Atitit dsl exer v3 qb3 新特性
    Atititi tesseract使用总结
    Atitit 修改密码的功能流程设计 attilax总结
    atitit.TokenService v3 qb1  token服务模块的设计 新特性.docx
  • 原文地址:https://www.cnblogs.com/wangwust/p/6385691.html
Copyright © 2011-2022 走看看