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

posted @ 2017-02-10 11:45  wangwust  阅读(323)  评论(0编辑  收藏  举报