Ninject依赖注入——构造函数、属性、方法和字段的注入(三)
来源:互联网 发布:航海家软件破解版 编辑:程序博客网 时间:2024/06/08 15:46
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):
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace NInjectApp{ /// <summary> /// 武器 /// </summary> public interface IWeapon { void Hit(string target); }}武器类Sword(Sword.cs):
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace NInjectApp{ /// <summary> /// 刀 /// </summary> public class Sword : IWeapon { public void Hit(string target) { Console.WriteLine("Hit the target {0} by sword", target); } }}勇士类Samurai(Samurai.cs),在构造函数Samurai中添加[Inject]属性(Attribute)。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Ninject;namespace NInjectApp{ /// <summary> /// 勇士 /// </summary> public class Samurai { private IWeapon _weapon; [Inject] public Samurai(IWeapon weapon) { _weapon = weapon; } public void Attack(string target) { _weapon.Hit(target); } }}添加勇士类别绑定模块类WarriorModule(WarriorModule.cs)。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Ninject.Modules;namespace NInjectApp{ public class WarriorModule : NinjectModule { public override void Load() { Bind<IWeapon>().To<Sword>(); Bind<Samurai>().ToSelf(); } }}创建模块(Module)后,将它们加载到Kernel容器中。调用Kernel的Get()方法,获取Ninject的类别实例。
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(kernal.Get<IWeapon>()); // 构造函数注入 Samurai s = kernal.Get<Samurai>(); s.Attack("enemy"); Console.ReadKey(); } }}如果需要的话,也可以创建多个模块(Module),将它们参数传递到Kernel的构造函数中。
public class Module1 { public override void Load() { ... }}public class Module2 { public override void Load() { ... }}class Program { public static void Main() { IKernel kernel = new StandardKernel(new Module1(), new Module2(), ...); ... }}
以上代码附件:Ninject构造函数注入.rar
2>、Ninject属性依赖注入(Property Injection)
与构造函数注入不同,可以有多个属性(Property)声明[Inject] Attribute。
修改Samurai类和Program类,其他不变。
Samurai类注入属性:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Ninject;namespace NInjectApp{ /// <summary> /// 勇士 /// </summary> public class Samurai { private IWeapon _weapon; /// <summary> /// 定义注入接口属性 /// </summary> [Inject] public IWeapon Weapon { get { return _weapon; } set { _weapon = value; } } public void Attack(string target) { _weapon.Hit(target); } }}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类添加注入方法:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Ninject;namespace NInjectApp{ /// <summary> /// 勇士 /// </summary> public class Samurai { private IWeapon _weapon; [Inject] public void Arm(IWeapon weapon) { _weapon = weapon; } public void Attack(string target) { _weapon.Hit(target); } }}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(); s.Arm(kernal.Get<IWeapon>()); // 方法注入 s.Attack("enemy"); Console.ReadKey(); } }}
4>、Ninject字段注入(Field Injection)
Ninject可以有多个字段(Field)声明[Inject]属性(Attribute),但在实际应用中尽量避免使用字段注入。
修改Samurai类和Program类,其他不变。
Samurai类添加注入字段:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Ninject;namespace NInjectApp{ /// <summary> /// 勇士 /// </summary> public class Samurai { [Inject] private IWeapon _weapon; public void Attack(string target) { _weapon.Hit(target); } }}
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(); s._weapon = kernal.Get<IWeapon>(); // 需将Samurai类中字段_weapon修饰符改为public才可以访问 s.Attack("enemy"); Console.ReadKey(); } }}
- Ninject依赖注入——构造函数、属性、方法和字段的注入(三)
- Ninject依赖注入——构造函数、属性、方法和字段的注入
- spring Ioc 依赖注入的三种方式:构造函数注入、setter方法注入和接口注入
- Spring笔记之一:依赖注入的方式属性注入和构造函数注入
- Spring依赖属性注入和构造函数注入
- 依赖注入(DI)和Ninject
- 依赖注入(DI)和Ninject
- 依赖注入(DI)和Ninject
- Spring_3_Spring的依赖注入_setter方法和构造函数方法
- Ninject(一)——手动依赖注入
- Spring依赖注入 — 构造器注入
- Spring依赖注入 — 构造器注入
- 三、依赖注入属性
- Spring属性注入和构造器注入、工厂方法注入
- 什么是构造函数注入(Constructor Injection)——一个具体的依赖注入例子
- Ninject——依赖注入的轻量级框架(MVC框架下的使用)
- 依赖注入之Ninject框架
- 依赖注入之Ninject框架
- 玩家控制器PlayerController、摄像机UCameraComponent
- 你设计的产品有为用户考虑吗?
- MongoDB 条件操作符
- 架构漫谈(九):理清技术、业务和架构的关系
- 腾讯云服务器CentOS6.5 配置 -- LAMP(appache,mysql,php)环境设置
- Ninject依赖注入——构造函数、属性、方法和字段的注入(三)
- 排序算法实现以及比较
- 设计模式之不变模式
- Java数组
- MongoDB $type 操作符
- Servlet-运行路径问题
- Educational Codeforces Round 15
- gradle报错
- 设计模式之访问者模式