ASP.NET MVC学前篇之Ninject的初步了解
ASP.NET MVC学前篇之Ninject的初步了解
1.介绍
废话几句,Ninject是一种轻量级的、基础.NET的一个开源IoC框架,在对于MVC框架的学习中会用到IoC框架的,因为这种IoC开源框架有很多,本篇的主题只有一个,就是让阅读过本篇幅的朋友逗知道IoC框架在项目中的作用,以及它的重要性。 这样做的目的是以便在以后的学习工作中选择自己中意的一个IoC框架来学习、使用,或者是自己去实现一个。好了,不废话了。
2.环境准备
1.新建个4.0Framework的一个控制台应用程序项目,名称为IoCDemo
2.在http://www.ninject.org/download网页中,下载Version 2.2版本的Ninject程序集(之前版本的不支持4.0库),下载完成解压后会看到如图1里的几个文件,在这里你只需要关心名称为Ninject的文件,其它的忽略掉。
图1

3.在项目中新建个Lib文件夹,并把Ninject.dll、Ninject.pdb和Ninject.xml三个文件拷贝到文件目录下,并且添加引用到项目中。如图2:
图2

环境准备工作做好了,可以安心的来看示例了。捎带一句Ninject.xml文件是程序集文件的注释,不过都是英文的,对于姿势水平不高的屌丝来说这并不算是福利,当然也包括本人。(ps:谷歌翻译什么的很好用)
3.初步认识、了解
从上一篇的文章中,可以了解到一个基础的IoC,这是站在容器对象的角度去考虑的,具体实现对象确实是可以动态的注入到容器对象中的。我们再看一下新的示例,并从中找到上一篇不足的地方,换个角度去看问题。
我们先定义了一个商品类,内容只包含了商品的编号、名称和价格三个属性
代码3-1
/// <summary>
/// 货品
/// </summary>
public class Commodity
{
public string CommodityID { get; set; }
public string Name { get; set; }
public float Price { get; set; }
}
商品类型定义好了之后,我们再定义个货品的计价规范和它的一个基础实现
代码3-2
/// <summary>
/// 货品计价规范
/// </summary>
public interface IValuation
{
float CommodityValuation(params Commodity[] commodities);
} /// <summary>
/// 货品计价规范实现一:商品价格合计
/// </summary>
public class CommoditySumValuation : IValuation
{
public float CommodityValuation(params Commodity[] commodities)
{
return commodities.Sum(commodity => commodity.Price);
}
}
这样看来架势和上一篇的相同,前段的确实是差不多的,不要着急慢慢来看。再定义个容器对象,并且通过构造注入的方式来实现解耦,让容器对象和具体实现彻底的分离了。
代码3-3
/// <summary>
/// 购物车-容器对象
/// </summary>
public class ShoppingCart
{
private IValuation _Valuation;
public ShoppingCart(IValuation valuation)
{
_Valuation = valuation;
} public float CommodityTotalPrice()
{
Commodity[] commodities =
{
new Commodity(){ CommodityID="A1", Price=},
new Commodity(){ CommodityID="A2", Price=76.5f},
new Commodity(){ CommodityID="B2", Price=34.4f},
new Commodity(){ CommodityID="C4", Price=23.1f}
}; return _Valuation.CommodityValuation(commodities);
}
}
对于上面那句话的定义,站在不同角度定义结果是不同的,如果站在容器对象的角度来看,确实是实现了解耦,如图3
图3

从图中可以明确的看到ShoppingCart类型(容器)和CommoditySumValuation类型(具体实现)没有任何的关系,从而以达到解耦的目的,但是问题要结合到实际从客户端调用容器对象来看:
代码3-4
namespace IoCDemo
{
class Program
{
static void Main(string[] args)
{
ShoppingCart shoppingCart = new ShoppingCart(new CommoditySumValuation()); }
}
}
代码看到这里,想必大家都会头疼了,这整的叫什么事,饶了一圈还是耦合了。如图4
图4

这种情况下IoC框架就可以派上用场了,本篇介绍的是Ninject,那当然是用Ninject了,根据前面的环境配置,
代码3-5
using Ninject; namespace IoCDemo
{
class Program
{
static void Main(string[] args)
{
#region IoC框架功能
IKernel kernel = new StandardKernel();
kernel.Bind<IValuation>().To<CommoditySumValuation>();
IValuation valuation = kernel.Get<IValuation>();
#endregion ShoppingCart shoppingCart = new ShoppingCart(valuation);
Console.WriteLine(shoppingCart.CommodityTotalPrice().ToString());
Console.ReadLine();
}
}
}
这里是通过Ninject中的IKernel类型的Bind泛型方法来绑定IValuation类型,用To泛型方法中的类型表示是Bind方法中类型的实现,这样在kernel.Get<IValuation>()的时候是返回的CommoditySumValuation类型。这里对Ninject的使用并不多做介绍,而是侧重的解释IoC的重要性及其作用。
这个时候的依赖结构如下图5
图5

这样可能看不出IoC的效果,我们再新增一些需求,并且更改CommoditySumValuation实现类,
代码3-6
/// <summary>
/// 计价折扣算法规范
/// </summary>
public interface IValuationDisCount
{
float ValuationDisCount(float listPrice);
} /// <summary>
/// 计价折扣算法规范实现一:九折 走起
/// </summary>
public class DisCount : IValuationDisCount
{ public float ValuationDisCount(float listPrice)
{
return listPrice - (listPrice * / );
}
}
添加了一个新需求规范和一个新的实现类,这样可以给商品总和来打折了,还需在CommoditySumValuation实现类中实现构造注入,修改代码如下:
代码3-7
/// <summary>
/// 货品计价规范实现一:商品价格合计
/// </summary>
public class CommoditySumValuation : IValuation
{
private IValuationDisCount valuationDisCount; public CommoditySumValuation(IValuationDisCount valuationdiscount)
{
this.valuationDisCount = valuationdiscount;
} public float CommodityValuation(params Commodity[] commodities)
{
return valuationDisCount.ValuationDisCount(commodities.Sum(commodity => commodity.Price));
}
}
这个时候如果没有IoC框架的存在,看下客户端是怎么来调用的:
代码3-8
using Ninject; namespace IoCDemo
{
class Program
{
static void Main(string[] args)
{
ShoppingCart shoppingCart =
new ShoppingCart(new CommoditySumValuation(new DisCount())); Console.WriteLine(shoppingCart.CommodityTotalPrice().ToString());
Console.ReadLine();
}
}
}
运行一下同样也能得到结果,但是不管怎么的去抽象,在客户端调用都需要直接依赖于实现类,而不是高层次的抽象,
图7

从图中可以看出来这是多么的恐怖。重新的修改下Main函数里的代码把IoC框架给使用起来。
代码3-9
using Ninject; namespace IoCDemo
{
class Program
{
static void Main(string[] args)
{
#region IoC框架功能
IKernel kernel = new StandardKernel();
kernel.Bind<IValuation>().To<CommoditySumValuation>();
kernel.Bind<IValuationDisCount>().To<DisCount>();
IValuation valuation = kernel.Get<IValuation>();
#endregion ShoppingCart shoppingCart = new ShoppingCart(valuation); Console.WriteLine(shoppingCart.CommodityTotalPrice().ToString());
Console.ReadLine();
}
}
}
结果如图8:
图8

再来看一下依赖结构,
图9

Ninject框架会检查要返回的类型所依赖的所有类型,并且也会动态的注入到类型当中。
从图7和图9的对比中可以看出,只有通过增加IoC框架来进行客户端和具体实现的解耦,没有这个中间层的加入还真的不好来实现消除耦合,并且IoC框架还可以进行动态配置。
本篇到这里结束了,对Ninject感兴趣的朋友请自行学习吧。
作者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
ASP.NET MVC学前篇之Ninject的初步了解的更多相关文章
- ASP.NET MVC学前篇之扩展方法、链式编程
ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...
- ASP.NET MVC学前篇之Lambda表达式、依赖倒置
ASP.NET MVC学前篇之Lambda表达式.依赖倒置 前言 随着上篇文章的阅读,可能有的朋友会有疑问,比如(A.Method(xxx=>xx>yy);)类似于这样的函数调用语句,里面 ...
- ASP.NET MVC学前篇之请求流程
ASP.NET MVC学前篇之请求流程 请求流程描述 对于请求的流程,文章的重点是讲HttpApplication和HttpModule之间的关系,以及一个简单的示例实现.(HttpModule又是M ...
- Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径
Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径 我们要实现 通过路由 匹配出 博客地址 和博客文章地址 例如下面的这两个地址 //http://www.cnblogs.com/ma ...
- 在 ASP.NET MVC 应用中使用 NInject 注入 ASMX 类型的 Web Service
这几天,有同学问到为什么在 ASP.NET MVC 应用中,无法在 .ASMX 中使用 NInject 进行注入. 现象 比如,我们定义了一个接口,然后定义了一个实现. public interfac ...
- Log4net入门(ASP.NET MVC 5篇)
在前4篇Log4net入门文章中,我们讲述了log4net的一些简单用法,在这一篇中我们主要讲述如何在ASP.NET MVC 5项目中将日志信息写入SQL Server数据库中. 一.创建最简单的AS ...
- ASP.NET MVC 路由篇二
轉載 http://www.cnblogs.com/yaozhenfa/p/asp_net_mvc_route_2.html 7.解决与物理路径的冲突 当发送一个请求至ASP.NET MVC时,其实会 ...
- 第16章 ASP.NET MVC 日志篇
本章主要介绍MVC中内置的错误处理.日志以及用来提升性能的监控工具 一.错误处理 当该网站忙于处理HTTP请求时,很多内容都会出错.幸运的是,MVC让错误处理工作变得相对简单了很多,因为MVC应用是运 ...
- ASP.NET MVC 系列随笔汇总[未完待续……]
ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...
随机推荐
- CozyRSS开发记录21-默认RSS源列表
CozyRSS开发记录21-默认RSS源列表 1.默认列表 在第一次使用CozyRSS的情况下,我们让它内置五个RSS源吧: 2.响应RSS源的更新 先不处理RSS源列表项的点击,响应下下拉菜单里的更 ...
- oracle普通表转分区表(在线重定义方式)
1.1.TAB_TAOBAO_BILL 1.1.1检查下这张表是否可以在线重定义,无报错表示可以,报错会给出错误信息: exec dbms_redefinition.can_redef_table(' ...
- git rebase 和 merge的区别
- 命名规范(数据库,c#)
Ⅰ. Naming Conventions 1. Table Naming Rule 1a ( Prefix) 新加的Table要加上適當的前缀 e.g. mUsr, eTxn, tmpRolle ...
- UGUI全面实践教程
UGUI全面实践教程 试读文档下载地址:http://pan.baidu.com/s/1hq3UYGk 介绍:UGUI是Unity官方推出的最新UI系统.本教程为国内唯一的UGUI专向资料.本教程 ...
- 域名解析服务查询工具dnstracer
域名解析服务查询工具dnstracer 在访问网站过程中,当用户输入网址后,通常是先解析域名,获取该网站的IP地址.然后,根据IP地址访问对应的网站服务器.所以,域名解析服务器保证域名指向正确的网 ...
- HTML5 学习笔记(一)——HTML5概要与新增标签
目录 一.HTML5概要 1.1.为什么需要HTML5 1.2.什么是HTML5 1.3.HTML5现状及浏览器支持 1.4.HTML5特性 1.5.HTML5优点与缺点 1.5.1.优点 1.5.2 ...
- 顺序表(SeqList)
---恢复内容开始--- 数据结构在上周结课,接下来就是为期几周的上机实验,说是实验课我感觉还不如不上.几乎每个人都是按着老师的要求把书上的代码打一遍,变都不变.一遍以后连自己打的什么都不知道. 与其 ...
- 洛谷 P1378 油滴扩展 Label:搜索
题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴. ...
- Java Servlet规范
截自网址:http://blog.csdn.net/u010391029/article/details/46521051 JavaServlet Specification Version 2.3 ...