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();        }    }}


1 0
原创粉丝点击