IOC框架Ninject实践总结

简介:

一、控制反转和依赖注入

Ninject是一个轻量级的基于.Net平台的依赖注入(IOC)框架。所谓的IOC,即控制反转(Inversion of Control),它是一个经典的面向对象编程法则,它的作用主要是用来帮助应用程序解耦,并把程序分离成一个个松耦合高内聚的模块。控制反转还有一个名字叫依赖注入(Dependency Injection),简称DI。

 

二、快速无xml配置注入

1、定义应用程序Module

ServiceModule

2、手动调用服务

InjectManual

 

注:Ninject的绑定对象作用域有多种,本文的demo中有具体的单元测试,具体可以直接查看源码或者参考官方文档。。

 

三、配置文件注入

通过Ninject的xml扩展,可以实现传统的类似于Spring.net、Unity等IOC容器的注入方式。

1、配置文件

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<module name="ServiceModule">
  <bind name="Txtlog" service="LogService.ILogService,LogService" to="LogService.Impl.TxtLogService,LogService"/>
  <!--<bind name="Dblog" service="LogService.ILogService,LogService" to="LogService.Impl.DbLogService,LogService"/>-->
  <bind name="Sword" service="NinjectApp.Weapon.IWeapon,NinjectApp" to="NinjectApp.Weapon.Sword,NinjectApp"/>
  <bind name="FootSoldier" service="NinjectApp.Warrior.IWarrior,NinjectApp" to="NinjectApp.Warrior.FootSoldier,NinjectApp"/>
</module>
 
 
复制代码

2、利用扩展加载服务

XmlServiceModule

 

3、调用服务

InjectByConfig

 

虽然配置注入看上去更容易扩展应对外部变化,但是项目庞大臃肿之后,配置文件并不好管理。固然有一些可视化的工具,但是仍然容易出现偏差。Ninject最擅长的基本注入功能就是无配置简单快速注入,达到free yourself from xml的目的,对于一般的中小型应用程序完全可以零配置。

 

四、MVC项目的依赖注入

通过Ninject的MVC扩展可以轻松实现MVC项目的依赖注入。

1、NinjectHttpApplication

在Global.asax.cs文件里重新定义MvcApplication继承自NinjectHttpApplication,重写OnApplicationStarted事件和CreateKernel方法:

MvcApplication

 

2、通过构造函数或者属性或者Module实现注入

(1)、Controller实现注入

a、构造函数注入

Account/Index

b、属性注入

定义属性,加上Inject特性即可实现注入。

       [Inject]
        public IUserService CurrentUserService { get; set; }

c、module注入

定义Module:

MvcServiceModule

 

接着调用即可:

MvcServiceModule

 

(2)、自定义Attribute实现注入

ExceptionHandleAttribute

 

和Controller非常相似,示例使用属性加上Inject特性的方式实现注入,其他注入方式略过。

到这里,你应该已经可以看到,这可以算是web应用程序中非常干净利落的注入方式,简单的令人发指。

 

五、组合还是继承

通过IOC框架实现服务依赖注入本来不难,但是这里或多或少会牵扯到一个问题:注入服务调用是使用组合还是继承?

举例来说,最基础的用户服务(或者日志服务),一般的web应用程序几乎每个控制器(或者页面)都或多或少和用户有关系。

问题来了,不同的控制器或者页面要调用用户服务该怎么做?

下面以MVC项目为例来说明一下通常的注入方法。

如你所知,通常的做法,所谓组合优于继承(继承被认为是一种强耦合),我们只要在需要调用服务的控制器中定义一个服务变量或者属性,通过构造函数注入,类似下面这样:

controllerconstructor

 

然后在对应的Action中就可以调用用户服务了。

如果你的Controller很少,这种方式当然可以接受。但是,实际项目中控制器真的比较多的时候,有一些几乎每个控制器必然用到的公共服务,我们是不是不得不哼哧哼哧写很多构造函数实现依赖注入呢?

到这里,你一定想到,是啊,都调用一样的服务,几乎都类似的代码,重构吧!

最简单的方式,利用继承,集中在一个地方(通常就叫BaseController吧)写一次,

BaseController

然后,在相应的Controller下this点服务属性名调用一下,多么优雅干净简洁。但是这种方式有一点需要特别需要注意,在Controller的构造函数里调用服务初始化一些数据可能不能让你那么随心所欲,因为在构造函数内,服务还没有初始化。

如上代码所示,通过Inject特性实现服务注入,通过继承实现公共服务调用,不管哪种表现形式的应用程序都可以使用,有AOP和继承的世界看上去是多么美好啊。当然了,具体使用哪种方式好每个人肯定都有自己的看法,实际项目中,我们通常选择组合和继承相结合的方式,这样就可以兼顾两者的优点实现注入。

最后还有几个困扰人的问题需要思考:如何划分服务?服务和服务之间是否应该依赖注入?如果仅仅是在表现层实现依赖注入,难道不觉得IOC的作用有点太酱油了吗?

 

domo下载:NinjectApp





本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2012/04/15/2450462.html,如需转载请自行联系原作者


目录
相关文章
|
11月前
|
存储 机器学习/深度学习 人工智能
【AI系统】昇腾 AI 核心单元
本文深入解析了华为昇腾AI处理器的核心——AI Core及其达芬奇架构。AI Core采用特定域架构(DSA),专为深度学习算法优化,通过矩阵、向量和标量计算单元的高效协作,实现了对深度学习算法的加速。文章详细介绍了AI Core的计算单元、存储系统及控制单元的设计,展示了其如何通过优化数据通路和控制流程,显著提升计算性能。
519 3
|
12月前
|
监控 前端开发 UED
理解 MVVM 中的数据双向绑定
【10月更文挑战第21天】数据双向绑定是 MVVM 架构中的一个核心特性,它为前端开发带来了诸多便利和优势。理解并熟练运用数据双向绑定,有助于我们构建更加高效、交互性更强的应用程序。同时,我们也需要在实际应用中注意性能和复杂性等方面的问题,以确保应用的良好运行和用户体验。还可以结合具体的项目经验和实际案例,进一步深入探讨数据双向绑定在不同场景下的应用和优化策略。
|
存储 算法 数据可视化
【Python】实现二维装箱Bottom-Left算法及用人工蜂群算法改进
本文介绍了二维装箱问题的Bottom-Left算法,并提供了Python实现,包括主函数、装箱顺序、重叠检测、最终位置计算等,同时指出了算法的缺点并提出了使用人工蜂群算法进行改进的方法,最后提供了完整代码的下载链接。
637 1
|
SQL 监控 数据可视化
DolphinScheduler教程(02)- 系统架构设计
DolphinScheduler教程(02)- 系统架构设计
1570 0
DolphinScheduler教程(02)- 系统架构设计
|
12月前
|
前端开发 Java
【案例+源码】详解MVC框架模式及其应用
【案例+源码】详解MVC框架模式及其应用
908 0
|
开发框架 算法 .NET
C#使用MiniExcel导入导出数据到Excel/CSV文件
C#使用MiniExcel导入导出数据到Excel/CSV文件
347 0
|
前端开发 C#
wpfui:一个开源免费具有现代化设计趋势的WPF控件库
wpfui:一个开源免费具有现代化设计趋势的WPF控件库
472 0
|
安全 编译器 C#
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
委托(delegate) 与 事件(event) 🔥 前言🙏 在之前的文章里介绍了C#中的委托(delegate) (Action、Func、Predicate)的基本含义及用法 那本篇文章在这里还要介绍一个跟委托有很大关系的小伙伴——C#中的 事件(event)🎅 事件跟委托是有很大联系的,所以也就导致很容易分不清他们两个,以及什么时候用这两个 上面有博客提到委托,想单独了解委托的可以去看一下,本篇文章主要说一下 什么是事件 🎄 以及 事件与委托的区别🎁
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
|
机器学习/深度学习 存储 并行计算
深入解析多目标优化技术:理论、实践与优化
深入解析多目标优化技术:理论、实践与优化
2670 1
|
缓存 开发框架 算法
.NET操作Excel高效低内存的开源框架 - MiniExcel
.NET操作Excel高效低内存的开源框架 - MiniExcel
346 0
.NET操作Excel高效低内存的开源框架 - MiniExcel