C# Ninject使用
Ninject是一个IOC容器,用来解决程序中组件的耦合问题,它的目的在于做到最少配置。简单来讲就是 为我们选择一个想要的类来处理事务。
百度百科的解释:一个快如闪电、超轻量级的基于.Net平台的依赖注入框架。把应用程序分离成一个个松耦合、高内聚的模块,然后用一种灵活的方式组装起来。
一、Console项目使用
参考:[ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject
NuGet引入:Ninject
/// <summary>
        /// 1、简单的情况,实现类 没有依赖其他类
        /// </summary>
        public static  void Simple()
        {
            //一般的使用情况
            Business bus = new Business(new LinqValueCalculator());
            decimal result = bus.CalculatStockValue();
            Console.WriteLine(result);
            //使用Ninject。。LinqValueCalculator绑定接口
            //1、创建一个Ninject内核对象
            IKernel ninjectKernel = new StandardKernel();
            //2、将想使用的类型和他的接口进行绑定,告诉Ninject,当接收到一个实现IValueCalculater的请求的时候,
            //创建并返回LinqValueCalculator这个类,上面的两个关键字Bind,To可以帮助我们理解他的意思。
            ninjectKernel.Bind<IValueCalculater>().To<LinqValueCalculator>();
            //3、用Ninject的Get方法去获取IValueCalculator接口的实现
            //Ninject将自动为我们创建LinqValueCalculator类的实例,并返回该实例的引用。
            IValueCalculater calcImpl = ninjectKernel.Get<IValueCalculater>();
            //4、创建Business实例并注入依赖(calcImpl)
            Business business = new Business(calcImpl);
            Console.WriteLine(business.CalculatStockValue());
        }
代码:https://github.com/peterYong/SelfTest/tree/master/Ninject.Test
对于单个简单的DI,用Ninject确实显得麻烦。但如果添加多个复杂点的依赖关系,使用Ninject则可大大提高编码的工作效率。
当我们请求Ninject创建某个类型的实例时,它会检查这个类型和其它类型之间的耦合关系。如果存在依赖关系,那么Ninject会根据依赖处理理它们,并创建所有所需类的实例。
拓展:
using (var kernel = new StandardKernel(new BookingServiceNinjectModule(),new CacheNinjectModule()))
{
Client = kernel.Get<IHoldTaskCksService>();
Redis = kernel.Get<ICacheManager>(CacheTypeName.Redis);
}
二、MVC中使用Ninject
代码:https://github.com/peterYong/SelfTest/tree/master/Ninject.MVC
参考:[ASP.NET MVC 小牛之路]05 - 使用 Ninject
1、创建Controller Factory
在ASP.NET MVC中,一个客户端请求是在特定Controller的Action中进行处理的。
默认情况下,ASP.NET MVC使用内置的Controller工厂类 DefaultControllerFactory来创建某个请求对应的Controller实例。
有时候默认的Controller工厂不能满足我们实际的需求,我们就需要对这种默认行为进行扩展,即创建一个继承自DefaultControllerFactory类的自定义Controller工厂类(NinjectControllerFactory)并重写其中的一些方法。
2、设置工厂
Controller工厂类创建好后,我们就需要告诉MVC用我们的NinjectControllerFactory类来创建Controller对象,为此,需在Global.asax文件的Application_Start方法中注册
3、添加领域模型
准备数据
4、添加接口,Repository
需要一种方式来从数据库中读取Book数据。
在这我们不防为数据的使用者(这里指Controller)提供一个IBookRepository接口,在这个接口中声明一个IQueryable<Book>类型的属性Books。
这样,通过该接口使用依赖注入,使用者就可以拿到Books数据集合,而不用关心数据是如何得到的。
为此,我们在BookShop.Domain工程中添加一个名为 Abstract的文件夹,在该文件夹中添加我们的IBookRepository接口文件,
5、添加接口实现
添加一个名为Implement文件夹用于存放具体的类。添加一个实现了IBookRepository接口的BookRepository类来作为我们的Book数据仓储。
6、添加绑定
private void AddBindings() {
    ninjectKernel.Bind<IBookRepository>().To<BookRepository>();
}
7、添加控制器
显示列表
8、添加视图
显示数据
更多参考:轻量级IOC框架:Ninject
C# Ninject使用的更多相关文章
- Ninject学习(一) - Dependency Injection By Hand
		
大体上是把官网上的翻译下而已. http://www.ninject.90iogjkdcrorg/wiki.html Dependency Injection By Hand So what's Ni ...
 - ASP.NET MVC学前篇之Ninject的初步了解
		
ASP.NET MVC学前篇之Ninject的初步了解 1.介绍 废话几句,Ninject是一种轻量级的.基础.NET的一个开源IoC框架,在对于MVC框架的学习中会用到IoC框架的,因为这种IoC开 ...
 - [ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject
		
本人博客已转移至:http://www.exblr.com/liam 为什么需要依赖注入 在[ASP.NET MVC 小牛之路]系列的理解MVC模式文章中,我们提到MVC的一个重要特征是关注点分离( ...
 - [ASP.NET MVC 小牛之路]05 - 使用 Ninject
		
在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事情,续这篇文章之后,本文将用一个实际的示例来 ...
 - 依赖注入(DI)和Ninject,Ninject
		
我们所需要的是,在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种“需要”,就称为DI(依赖注入,Dependency Injection),和所谓的IoC(控制反转,I ...
 - EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(六)
		
前言 在接下来的篇幅里将对系统的模块功能进行编写.主要以代码实现为主.这一篇我们需要完成系统模块“角色管理”的相关功能.完成后可以对系统框架结构有进一步了解. Abstract层 之前说过,Abstr ...
 - EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(一)
		
前言 本系列源自对EF6 CodeFirst的探索,但后来发现在自己项目中构建的时候遇到了一些问题以及一些解决方法,因此想作为一个系列写下来. 本系列并不是教你怎么做架构设计,但可以参照一下里面的方法 ...
 - Ninject使用介绍
		
#region 第二种写法 /// <summary> /// using(IKernel tKernel=new StandardKernel(new PeoKernelServer() ...
 - 使用Ninject进行DI(依赖注入)
		
Ninject是一个快如闪电.超轻量级的基于.Net平台的依赖注入框架.它能够帮助你把应用程序分离成一个个松耦合.高内聚的模块,然后用一种灵活的方式组装起来.通过使用Ninject配套你的软件架构,那 ...
 - Ninject之旅之十一:Ninject动态工厂(附程序下载)
		
摘要 如果我们已经知道了一个类所有的依赖项,在我们只需要依赖项的一个实例的场景中,在类的构造函数中引入一系列的依赖项是容易的.但是有些情况,我们需要在一个类里创建依赖项的多个实例,这时候Ninject ...
 
随机推荐
- ArcGIS JS 之通过代理配置ArcGIS Server服务 token
			
ArcGIS JS 代理 1.ArcGIS Server Manager中配置访问服务的用户名.密码.角色等,并配置地图服务的具体角色名称 2.在ArcGIS JS中配置使用代理,下述代码将esri的 ...
 - VirtualBox导入OVA文件文档教程
			
1 2 修改框住的路径,最好不要在C盘 3 取消检查更新 4 5 6 7 8 9 10 11 等待加载完成:加载完成后 OVA文件导入成功 作者:含笑半步颠√ 博客链接:https://www.cnb ...
 - 转:JVM的符号引用和直接引用
			
在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可 ...
 - WPF 的 Application.Current.Dispatcher 中,为什么 Current 可能为 null
			
原文:WPF 的 Application.Current.Dispatcher 中,为什么 Current 可能为 null 在 WPF 程序中,可能会存在 Application.Current.D ...
 - js编写日历的思路
			
首先写出一个日历我们需要考虑以下2个问题: 每个月的总天数 每个月的第一天周几 这里提供了一个判断平年闰年2月份天数的方法: function leapYear(year) { return (yea ...
 - web前端布局HTML+CSS
			
1.W3C标准 万维网联盟(外语缩写:W3C)标准不是某一个标准,而是一系列标准的集合.网页主要由三部分组成:结构(Structure).表现(Presentation)和行为(Behavior).万 ...
 - Python学习资料收集
			
1.Learn Python the hard way 2.Google's Python lesson 3.Python最佳实践 4.Full Stack Python 5.explore flas ...
 - stdClass 标准
			
在WordPress中很多地方使用stdClass来定义一个对象(而通常是用数组的方式),然后使用get_object_vars来把定义的对象『转换』成数组. 如下代码所示: $tanteng = n ...
 - [ipsec][strongswan] 使用VTI配置基于路由的ipsec
			
之前写的一个:[dev][ipsec] 基于路由的VPrivateN 一 我们默认用strongswan的时候基于策略的. 也就是policy. 基于策略的ipsec中, policy承担了两部分功能 ...
 - NTP时间服务器+DHCP服务器的搭建
			
一.构建NTP时间服务器 ntp服务器监控端口UDP:123 安装ntp和ntpdate 命令:yum -y install ntp netdate 修改配置文件/etc/ntp.conf 启动nt ...