博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快如闪电、超轻量级的基于.Net平台的依赖注入框架Ninject
阅读量:6822 次
发布时间:2019-06-26

本文共 4149 字,大约阅读时间需要 13 分钟。

一、为什么要使用依赖注入框架

  依赖注入框架也叫IoC容器。它的作用使类与类之间解耦

  我们看看为什么要用依赖注入框架,举个几个梨子:

  1,高度耦合的类

  

      有一个Order类,Order类是用于订单操作的,DataAccess使用的sqlserver的方式查询订单。看看代码:

public class Order    {        private DataAccess dataAccess = new DataAccess(); public string QueryOrder() { return dataAccess.QueryOrder(); } } public class DataAccess { public string QueryOrder() { return "sqlserver查询Order"; } }

 

  看到这两个类(Order,DataAccess),它们出现了高度耦合。如果产品汪突然狂犬病大发让我们换成MySql方式查询,我们不得不 修改Order类的private DataAccess data = new DataAccess() 和DataAccess的QueryOrder方法。这里违反了开放封闭原则(对扩展开放,对修改关闭),当然一个项目不只只有订单(Order)操作,还有购物车、产品等等操作,那改动起来将会是一场噩梦。

 

  2,使用依赖倒转原则来改进

  依赖倒转原则口诀:高层次模块不应该依赖于低层次模块,要依赖抽象,不要依赖具体。

  口诀听着很绕口,其实理解起来并不难,看下面的类图,Order相当于是高层模块,SqlServerData和MySqlData相当于底层模块,高层模块依赖于接口,所以可以随时更换底层模块

  

  我们现在把DataAccess抽象为接口,使SqlServerData和MySqlData实现IDataAccess

public class Order    {        private IDataAccess dataAccess = new MySqlData(); public string QueryOrder() { return dataAccess.QueryOrder(); } } public interface IDataAccess { string QueryOrder(); } public class SqlServerData : IDataAccess { public string QueryOrder() { return "sqlserver查询Order"; } } public class MySqlData : IDataAccess { public string QueryOrder() { return "MySql查询Order"; } }

  现在我们高层模块依赖于接口,如果产品汪再叫我们换Oracle数据库,我们就可以再添加一个OracleData类,然后实现 IDataAccess接口,然后在Order类中的private IDataAccess dataAccess = new MySqlData()改为private IDataAccess dataAccess = new OracleData()。虽然改动的地方减少了,但是我们还是修改了类。可是我们并不希望修改类,就可以更换数据访问,这就需要解耦,需要用到Ioc容 器,我们的Ninject终于该出场了,出场费还不低哦!

 

二、实战Ninject

  

 

1,使用注册机制

  首先安装一个Ninject的Dll,我们用NuGet安装。

  ①反键项目引用,选中管理NuGet程序包

  

  ②搜索Ninject,点击安装

  

  ③代码实现(只实现Order类操作,Product类操作与Order类一致)

  IDataAccess:

using System;using System.Collections.Generic;using System.Linq; using System.Text; namespace RegisterNinject { public interface IDataAccess { string QueryOrder(); } }

  MySqlDataOrder:

using System;using System.Collections.Generic;using System.Linq; using System.Text; namespace RegisterNinject { public class MySqlDataOrder : IDataAccess { public string QueryOrder() { return "MySql查询Order"; } } }

  SqlServerDataOrder:

using System;using System.Collections.Generic;using System.Linq; using System.Text; namespace RegisterNinject { public class SqlServerDataOrder : IDataAccess { public string QueryOrder() { return "sqlserver查询Order"; } } }

  Register:

using System;using System.Collections.Generic;using System.Linq; using System.Text; using Ninject; //引入命名空间 namespace RegisterNinject { public class Register { private StandardKernel _kernel = new StandardKernel(); // 在这里注册 public Register() { _kernel.Bind
().To
(); //_kernel.Bind
().To
(); //_kernel.Bind
().To
(); } //获取 public TInterface Get
() { return _kernel.Get
(); } public void Dispose() { _kernel.Dispose(); } } }

  Order:

using System;using System.Collections.Generic;using System.Linq; using System.Text; namespace RegisterNinject { public class Order { private Register reg = new Register(); public string QueryOrder() { return reg.Get
().QueryOrder(); } } }

 

  这样,妈妈再也不用担心我换数据库了。如果产品汪再让我们换回sqlserver数据库[神经病](小插曲:换数据库是举的例子,Ioc容器的意义是让类与类之间解耦的,不是换数据库用的!),我们只需要在Register类中的构造函数中修改注册即可。

  有人说,"你还是修改了类呀!"。Register类的定位不一样,他是一个公共类,专门提供注册机制的。如果不去要修改类,就能完成换数据库,那就要引入新的概念———热插拔技术。

  

2,使用Xml文件(热插拔)

  现在我们用xml文件的方式,动态的更换接口。我们需要建一个xml文件。把他放在项目中。

  Register.xml

 

  注意:module元素,name属性,bind元素,service属性,to属性为规定的元素属性,不能写成别的。格式也要正确。

  然后更改下Register:

using System;using System.Collections.Generic;using System.Linq; using System.Text; using Ninject; //引入命名空间 using Ninject.Extensions.Xml;//引入命名空间 namespace XmlNinject { public class Register { private StandardKernel _kernel = new StandardKernel(); // 以后这里就不用更改这里了,只需要该xml文件就可以了 public Register() { var settings = new NinjectSettings() { LoadExtensions = false }; _kernel = new StandardKernel(settings, new XmlExtensionModule()); _kernel.Load("Xml/Register.xml"); } //获取 public TInterface Get
() { return _kernel.Get
(); } public void Dispose() { _kernel.Dispose(); } } }

   以后要更换接口,直接更改xml文件就可以了。

   源码下载  

转载地址:http://xkozl.baihongyu.com/

你可能感兴趣的文章
换个姿势学数学:二次函数与拆弹部队
查看>>
React-事件机制杂记
查看>>
python的常用模块
查看>>
我的友情链接
查看>>
Delphi下WebBrowser应用示例
查看>>
AS3的http
查看>>
启动模式、时钟浅见
查看>>
ORA-01033: ORACLE initialization or shutdown in progress ,Enterprise Manager Console
查看>>
Intellij IDEA 一些不为人知的技巧
查看>>
演示:如何编译tbox
查看>>
简单的安卓应用授权认证(JNI)
查看>>
查看硬盘读取速率
查看>>
把匹配的小写转换成大写(\U、\u)
查看>>
【Android网络开发の5】Android中的网络数据下载
查看>>
linux终端使用python的matplotlib模块画图出现“could not open display”问题解决
查看>>
9月国内浏览器市场份额大战:IE份额上升至48.45%
查看>>
Tapestry 教程(五)实现Hi-Lo猜谜游戏
查看>>
2015年12月国内网民地域分布12强:湖北跻身上榜
查看>>
mysql-5.6安装
查看>>
LNMP环境搭建 Ubuntu篇
查看>>