Ninject依赖注入——构造函数、属性、方法和字段的注入
2014-03-27 14:29
387 查看
Ninject依赖注入——构造函数、属性、方法和字段的注入(三)
1、Ninject简介Ninject是基于.Net平台的依赖注入框架,它能够将应用程序分离成一个个高内聚、低耦合(loosely-coupled, highly-cohesive)的模块,然后以一种灵活的方式组织起来。Ninject可以使代码变得更容易编写、重用、测试和修改。
Ninject官方网址为:http://www.ninject.org/ 。
2、项目引用Ninject
1>、 Tools -> Libaary Package Manager -> Package Manager Console,打开Package Manager Console窗口;
2>、在Package Manager Console窗口中输入指令,Enter;
1 PM> Install-Package Ninject
3>、在项目中添加对Ninject的引用。
3、Ninject使用Modules and the Kernel注入
Ninject中将类别以模块(Module)形式进行分组绑定,每一个模块代表应用程序的一个独立部分,这些模块可以根据需要进行组织。每一个模块都需要实现接口IModule,多数采用扩展StandardModule类来便捷实现。
Ninject依赖注入包括构造函数、属性、方法和字段的依赖注入。以下先通过构造函数注入方式进行说明,仍采用上节中使用的接口及类。
1>、Ninject构造函数依赖注入(Constructor Injection)
武器接口IWeapon(IWeapon.cs):
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace NInjectApp 7 { 8 /// <summary> 9 /// 武器 10 /// </summary> 11 public interface IWeapon 12 { 13 void Hit(string target); 14 } 15 }
武器类Sword(Sword.cs):
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace NInjectApp 7 { 8 /// <summary> 9 /// 刀 10 /// </summary> 11 public class Sword : IWeapon 12 { 13 public void Hit(string target) 14 { 15 Console.WriteLine("Hit the target {0} by sword", target); 16 } 17 } 18 }
勇士类Samurai(Samurai.cs),在构造函数Samurai中添加[Inject]属性(Attribute)。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Ninject; 7 8 namespace NInjectApp 9 { 10 /// <summary> 11 /// 勇士 12 /// </summary> 13 public class Samurai 14 { 15 private IWeapon _weapon; 16 17 [Inject] 18 public Samurai(IWeapon weapon) 19 { 20 _weapon = weapon; 21 } 22 23 public void Attack(string target) 24 { 25 _weapon.Hit(target); 26 } 27 } 28 }
添加勇士类别绑定模块类WarriorModule(WarriorModule.cs)。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Ninject.Modules; 7 8 namespace NInjectApp 9 { 10 public class WarriorModule : NinjectModule 11 { 12 public override void Load() 13 { 14 Bind<IWeapon>().To<Sword>(); 15 Bind<Samurai>().ToSelf(); 16 } 17 } 18 }
创建模块(Module)后,将它们加载到Kernel容器中。调用Kernel的Get()方法,获取Ninject的类别实例。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Ninject; 7 8 namespace NInjectApp 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 IKernel kernal = new StandardKernel(new WarriorModule()); 15 //Samurai s = new Samurai(kernal.Get<IWeapon>()); // 构造函数注入 16 Samurai s = kernal.Get<Samurai>(); 17 s.Attack("enemy"); 18 19 Console.ReadKey(); 20 } 21 } 22 }
如果需要的话,也可以创建多个模块(Module),将它们参数传递到Kernel的构造函数中。
1 public class Module1 { 2 public override void Load() { ... } 3 } 4 5 public class Module2 { 6 public override void Load() { ... } 7 } 8 9 class Program { 10 public static void Main() 11 { 12 IKernel kernel = new StandardKernel(new Module1(), new Module2(), ...); 13 ... 14 } 15 }
以上代码附件:Ninject构造函数注入.rar
2>、Ninject属性依赖注入(Property Injection)
与构造函数注入不同,可以有多个属性(Property)声明[Inject] Attribute。
修改Samurai类和Program类,其他不变。
Samurai类注入属性:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Ninject; 7 8 namespace NInjectApp 9 { 10 /// <summary> 11 /// 勇士 12 /// </summary> 13 public class Samurai 14 { 15 private IWeapon _weapon; 16 17 /// <summary> 18 /// 定义注入接口属性 19 /// </summary> 20 [Inject] 21 public IWeapon Weapon 22 { 23 get 24 { 25 return _weapon; 26 } 27 set 28 { 29 _weapon = value; 30 } 31 } 32 33 public void Attack(string target) 34 { 35 _weapon.Hit(target); 36 } 37 } 38 }
Program类调用:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Ninject; namespace NInjectApp { class Program { static void Main(string[] args) { IKernel kernal = new StandardKernel(new WarriorModule()); Samurai s = new Samurai() { Weapon = kernal.Get<IWeapon>() };// 属性注入 s.Attack("enemy"); Console.ReadKey(); } } }
3>、Ninject方法注入(Method Injection)
Ninject可以有多个方法(Method)声明[Inject]属性(Attribute)。
修改Samurai类和Program类,其他不变。
Samurai类添加注入方法:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Ninject; 7 8 namespace NInjectApp 9 { 10 /// <summary> 11 /// 勇士 12 /// </summary> 13 public class Samurai 14 { 15 private IWeapon _weapon; 16 17 [Inject] 18 public void Arm(IWeapon weapon) 19 { 20 _weapon = weapon; 21 } 22 23 public void Attack(string target) 24 { 25 _weapon.Hit(target); 26 } 27 } 28 }
Program类调用注入方法:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Ninject; 7 8 namespace NInjectApp 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 IKernel kernal = new StandardKernel(new WarriorModule()); 15 Samurai s = new Samurai(); 16 s.Arm(kernal.Get<IWeapon>()); // 方法注入 17 s.Attack("enemy"); 18 19 Console.ReadKey(); 20 } 21 } 22 }
4>、Ninject字段注入(Field Injection)
Ninject可以有多个字段(Field)声明[Inject]属性(Attribute),但在实际应用中尽量避免使用字段注入。
修改Samurai类和Program类,其他不变。
Samurai类添加注入字段:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Ninject; 7 8 namespace NInjectApp 9 { 10 /// <summary> 11 /// 勇士 12 /// </summary> 13 public class Samurai 14 { 15 [Inject] 16 private IWeapon _weapon; 17 18 public void Attack(string target) 19 { 20 _weapon.Hit(target); 21 } 22 } 23 }
Program类中调用注入字段:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Ninject; 7 8 namespace NInjectApp 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 IKernel kernal = new StandardKernel(new WarriorModule()); 15 Samurai s = new Samurai(); 16 s._weapon = kernal.Get<IWeapon>(); // 需将Samurai类中字段_weapon修饰符改为public才可以访问 17 s.Attack("enemy"); 18 19 Console.ReadKey(); 20 } 21 } 22 }
参考资料:
http://ninject.codeplex.com/wikipage?title=Injection%20Patterns&referringTitle=Dependency%20Injection%20With%20Ninject
依赖注入
Ninject依赖注入——构造函数、属性、方法和字段的注入(三)摘要: 1、Ninject简介 Ninject是基于.Net平台的依赖注入框架,它能够将应用程序分离成一个个高内聚、低耦合(loosely-coupled, highly-cohesive)的模块,然后以一种灵活的方式组织起来。Ninject可以使代码变得更容易编写、重用、测试和修改。 Ninject官方网址为:http://www.ninject.org/ 。2、项目引用Ninject1>、 Tools -> Libaary Package Manager -> Package Manager Console,打开Package Manager Console窗口;2>、在P阅读全文
posted @ 2012-03-11 05:03 libingql 阅读(899) | 评论 (0) 编辑
手动依赖注入(二)
摘要: 首先通过下面简单的例子理解依赖注入思想。假如你正在玩一个游戏,勇士们为荣耀而战。首先需要为我们的勇士装备合适的武器。 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Inject 7 { 8 /// <summary> 9 /// 刀10 /// </summary>11 public class Sword12 {13 public void Hit(string ...阅读全文
posted @ 2012-03-11 03:13 libingql 阅读(178) | 评论 (1) 编辑
依赖注入简介(一)
摘要: 待补充阅读全文
posted @ 2012-03-11 02:46 libingql 阅读(125) | 评论 (0) 编辑
相关文章推荐
- Ninject依赖注入——构造函数、属性、方法和字段的注入(三)
- Ninject依赖注入——构造函数、属性、方法和字段的注入(三)
- Ninject依赖注入——构造函数、属性、方法和字段的注入
- (spring-第3回【IoC基础篇】)spring的依赖注入-属性、构造函数、工厂方法等的注入(基于XML)
- spring Ioc 依赖注入的三种方式:构造函数注入、setter方法注入和接口注入
- p命名空间简化属性依赖注入之setter方法
- 百行代码打造一个DI容器(支持瞬时生命周期、单利生命周期、构造函数自动注入、属性自动注入、字段自动注入)
- Laravel实现构造函数自动依赖注入的方法
- spring ioc容器注入的集中方式,以及属性注入的集中依赖,继承,使用SPEL表达式,ioc容器的生命周期,bean的几种工厂方法配置方式,bean的自动装配
- spring中依赖注入 属性无set方法
- set方法注入依赖属性
- 类和对象(字段=变量、方法=函数、方法重载、静态成员、属性、构造函数)
- Chapter 8. 面向对象(类、对象、字段、方法、属性、构造函数)
- Spring第六弹—-依赖注入之使用构造器注入与使用属性setter方法注入
- Spring依赖属性注入和构造函数注入
- Spring依赖注入方式_属性setter方法注入_构造器注入_注解注入
- VB.net 类、对象、字段、属性、方法、构造函数
- Spring(六)属性依赖注入(构造方法,setter方法,p命名空间,spel表达式,集合注入)
- Laravel实现构造函数自动依赖注入的方法
- Spring_3_Spring的依赖注入_setter方法和构造函数方法