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接口的实现者)的引用。

  • 相关阅读:
    cordova build android get Execution failed for task ':dexArmv7Debug'
    brew install memcache get Error: Formulae found in multiple taps
    快速激活JetBrains系列产品
    NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
    `libsass` bindings not found. Try reinstalling `node-sass`?
    Cordova 快速入门记录
    perl: warning: Setting locale failed.
    httpclient源码分析之 PoolingHttpClientConnectionManager 获取连接
    httpclient源码分析之MainClientExec
    fastjson从1.1.41升级到1.2.28的坑
  • 原文地址:https://www.cnblogs.com/wangwust/p/6385691.html
Copyright © 2011-2022 走看看