在mvc中使用Ninject进行依赖注入

说到依赖注入 ,首先要提到控制反转,控制反转(Inversion of
Control,英文缩写为IoC)是一个重要的面向对象编程的原则,目的是来削减计算机程序的耦合问题控制反转一般分为两种类型,

依赖注入(Dependency Injection,简称DI)和依赖查找。两者的区别在于,前者是被动的接收对象,在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的

属性中,而后者是主动索取响应名称的对象,获得依赖对象的时间也可以在代码中自由控制。但是依赖注入的应用比较广泛。MVC的一个重要特征是关注点分离(separation of
concerns)。应用程序的

各部分组件应该尽可能多的相互独立、尽可能少的相互依赖,关于依赖注入详细介绍的文章园子里已经很多了,如T2噬菌体的依赖注入那些事儿

依赖注入有如下实现方式:基于接口。实现特定接口以供外部容器注入所依赖类型的对象。基于 set 方法。实现特定属性的public
set方法,来让外部容器调用传入所依赖类型的对象。基于构造函数。实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。

NET平台中有许多优秀的IOC框架如:NinjectSpring.NETObjectBuilderStructuremapCastleProjectSeasar等。

目前我在学习MVC阶段,只接触了Ninject,以下的代码也是基于这个框架编写的。

首先使用VS2012的NuGet下载安装Ninject

在项目中添加 NinjectControllerFactory类如下:


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:后面再来添加绑定

}
}

使用repository模式将领域模型从客户代码和数据映射层之间解耦出来。

创建一个通用的存储接口IRepository


 public interface IRepository<T> where T : class
{
IQueryable<T> Lists { get;}
}

创建模型类


public class Book
{
public int ID { get; set; }
public string Title { get; set; }
public string Isbn { get; set; }
public string Summary { get; set; }
public string Author { get; set; }
public byte[] Thumbnail { get; set; }
public decimal Price { get; set; }
public DateTime Published { get; set; }
}

创建实现IRepository<T>接口的 BookRepository<Book>


 public IQueryable<Book> Lists { get { return GetBooks().AsQueryable(); } }

private static List<Book> GetBooks()
{
//为了演示,这里手工造一些数据,后面会介绍使用EF从数据库中读取。
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;
}

接下来修改前面NinjectControllerFactory类的 AddBindings()方法


private void AddBindings()
{
// todo:后面再来添加绑定

ninjectKernel.Bind<IRepository<Book>>).To<BookRepository>();

}

这样Ninject会自动帮我们创建我们所需要的类的实例

我们需要在Global.asax文件中注册NinjectControllerFactory类


protected void Application_Start()
{
.
.
.
.

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());//注册NinjectControllerFactory类
}

创建BookController控制器


public class BookController : Controller
{
//
// GET: /Book/
private IRepository<Book> bookrepository;
public BookController(IRepository<Book> bookRepository, IRepository<Author> authorepository)
{
this.bookrepository = bookRepository;
this.authorepository = authorepository;
}
public ActionResult Index()
{
return View();
}

public ViewResult BookList()
{
return View(bookrepository.Lists);
}

}

创建BookList视图页面代码如下


@model IQueryable<BookShopDomain.Book>
@{
ViewBag.Title = "BookList";
}

@Html.Action("View1")
<h2>BookList</h2>
@foreach (var book in Model)
{
<div class="item" style="border-bottom: 1px dashed silver;">
<h3>@book.Title</h3>
<p>价格:@book.Price.ToString("c") </p>
</div>
}

打开浏览器,在地址栏输入一面地址程序运行成功:

一个简单的mvc依赖注入程序就完成了。这里我只是简单的使用Ninject,还需继续深入学习。

在mvc中使用Ninject进行依赖注入,布布扣,bubuko.com

时间: 2024-10-22 19:29:48

在mvc中使用Ninject进行依赖注入的相关文章

在ASP.NET MVC中使用Unity进行依赖注入的三种方式

在ASP.NET MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请求的 Controller,让Controller依赖于ModelRepository的抽象而不是它的实现. 我们可以在三个阶段使用IoC实现上面所说的解耦操作,首先需要简单介绍一下默认情况下Controller的激活过程: 1.用户发送请求黑ASP.NET,路由系统对请求进行解析,根据注册的路由规则对请求进行匹配,解析出Controller和Ac

MVC中使用Ninject依赖注入

在.NET MVC中使用Ninject注入,主要分为以下几步: 使用NuGet包添加Ninject引用,我添加的是目前最新版本3.34 在App_Start文件夹下,创建NinjectControllerFactory类 在Global中添加如下代码 项目中主要使用的是接口注入,可参考Iuser调用例子 public class NinjectControllerFactory: DefaultControllerFactory { private IKernel Kernel; public

[ASP.NET MVC 小牛之路]05 - 使用 Ninject实现依赖注入

在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事情,续这篇文章之后,本文将用一个实际的示例来演示Ninject在ASP.NET MVC中的应用. 为了更好的理解和撑握本文内容,强烈建议初学者阅读本文前先阅读依赖注入(DI)和Ninject. 本文目录: 准备工作 新建一个名为BookShop的空白解决方案.在该解决方案中分别添加一个名为BookShop.WebUI的MVC空应用程序,和一个

在ASP.NET Web API和ASP.NET Web MVC中使用Ninject

先附上源码下载地址 一.准备工作 1.新建一个名为MvcDemo的空解决方案 2.新建一个名为MvcDemo.WebUI的空MVC应用程序 3.使用NuGet安装Ninject库 二.在ASP.NET MVC中使用Ninject 1.新建一个Product实体类,代码如下: public class Product { public int ProductId { get; set ; } public string Name { get; set ; } public string Descr

AngularJS学习--- AngularJS中XHR(AJAX)和依赖注入(DI) step5

前言:本文接前一篇文章,主要介绍什么是XHR,AJAX,DI,angularjs中如何使用XHR和DI. 1.切换工具目录 git checkout -f step-5 #切换分支 npm start #启动项目 2.什么是XHR和依赖注入(Dependency Injection)? 1)什么是XHR? XHR是XMLHttpRequest的简称,XMLHttpRequest 用于在后台与服务器交换数据,主要是为了实现在不重新加载整个网页的情况下,对网页的某部分进行更新.简单说,浏览器中URL

在 mvc 4 中使用 unity 进行依赖注入

关于依赖注入的概念,这里就不再叙述了,我们用 mvc 4 结合 unity,使用构造函数来进行依 赖注入.具体步骤如下: 1. 首先建立 一个 mvc 项目, 选择 basic 创建好后,完整的项目应该是这样的: 2. 创建 Home控制器, 并添加 index 视图 3.创建 UserInfo 类, 和 Iuser 接口以及 UserService类,UserService 实现Iuser 接口中 的方法, 其中的业务逻辑自己可以根据具体的情况来实现 4.打开 Nuget 程序管理包, 在搜索

【ASP.NET MVC 学习笔记】- 04 依赖注入(DI)

本文参考:http://www.cnblogs.com/willick/p/3223042.html 1.在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种"需要",就称为依赖注入(Dependency Injection). 2.依赖注入和和所谓的控制反转(Inversion of Control )是一个意思. 3.依赖注入是通过接口实现松耦合的设计模式,是解耦的重要手段. 4.依赖注入分为两步:移除对组件的依赖:通过类的构造器(或setter访问器)

php中的数种依赖注入

经常看到却一直不甚理解的概念,依赖注入(DI)以及控制器反转(Ioc),找了几篇好的文章,分享一下. 自己理解的,依赖注入就是组件通过构造器,方法或者属性字段来获取相应的依赖对象. 举个现实生活中的例子来理解, 比如我要一把菜刀 如何获得1.可以自己造一把,对应new一个.2.可以找生产菜刀的工厂去买一把,对应工厂模式.3.可以打电话 让店家送货上门,对应依赖注入. 再比如我是一个演员,我不可能要求某个导演,我要演某某剧的男一号,相反,导演可以决定让谁来演.而我们的object就是这个演员. 注

python中的接口和依赖注入

首先,我们必须明确的一点是:python里无接口类型,定义接口只是一个人为规定,在编程过程自我约束 python的类是可以写任意个方法的 定义一个接口对继承类进行约束,接口里有什么方法,继承类就必须有什么方法,接口中不能任何功能代码 class Interface: def f1(self): ''' to do something :return: ''' class Something(Interface): def f1(self): print('to do something...')