本文参考: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 = , Title = "ASP.NET MVC 4 编程", Price = },
new Book { ID = , Title = "CLR Via C#", Price = },
new Book { ID = , Title = "平凡的世界", Price = }
};
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接口的实现者)的引用。

最新文章

  1. DOM 事件深入浅出(一)
  2. c语言中的一些注意点
  3. 如何在winform或者wpf里面打开浏览器并设置宽高位置
  4. WPF中多个RadioButton绑定到一个属性
  5. Dreamweaver 制作图片热点之后,点击热点部分会有个提示框,怎么去掉
  6. Linux 基础入门 第二周9.21~9.27
  7. libcurl编程学习
  8. 2014年度辛星html教程夏季版第四节
  9. 关于LAMP的配置之(虚拟机的安装、创建、配置)
  10. C# 使用Parallel并行开发Parallel.For、Parallel.Foreach实例
  11. SpringCloud Ribbon的分析(二)
  12. react创建项目很慢,最后提示fetch failed的解决方法
  13. react Hooks
  14. Js_网站右下角悬浮视窗可关闭广告
  15. Python3基础 os listdir 列举指定的所有文件及文件夹的名字
  16. 7-26 Harry Potter&#39;s Exam(25 分)
  17. 《JavaWeb从入门到改行》很好的复习资料: SQL语句到底怎么写 ?
  18. 【Linux】- cat命令的源码历史
  19. play的过滤类怎么实现继承问题
  20. 1030: [JSOI2007]文本生成器 ac自动机+dp

热门文章

  1. 201521123023《Java程序设计》第14周学习总结
  2. JS运动缓冲的封装函数
  3. Maven常见错误以及解决方案【转载】
  4. Struts2第二篇【开发步骤、执行流程、struts.xml讲解、defalut-struts讲解】
  5. java乱码问题处理
  6. 使用Spring的隐式注解和装配以及使用SpringTest框架
  7. [转]Xcode的快捷键及代码格式化
  8. 利用ASP.NET操作IIS (可以制作安装程序)
  9. 705. New Distinct Substrings spoj(后缀数组求所有不同子串)
  10. P1045