zoukankan      html  css  js  c++  java
  • 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





  • 相关阅读:
    Openresty+redis实现灰度发布
    Nginx keepalived
    Nginx反向代理、负载均衡、动静分离、缓存、压缩、防盗链、跨域访问
    MYCAT扩容
    MYCAT全局序列
    MYCAT分库分表
    MySQL主从复制
    [redis] linux下集群篇(4) docker部署
    [nginx] CORS配置多域名
    [mysql] 归档工具pt-archiver,binlog格式由mixed变成row
  • 原文地址:https://www.cnblogs.com/libingql/p/2389770.html
Copyright © 2011-2022 走看看