热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

手动依赖性注入

NInject介绍Ninject是基于.Net平台的依赖注入框架。它能够帮助你把应用程序分离成一个个松耦合、高内聚的模块,然后用一种灵活的方式组装起来。通过使用Ninject软件架构,会

NInject介绍

  Ninject是基于.Net平台的依赖注入框架。它能够帮助你把应用程序分离成一个个松耦合、高内聚的模块,然后用一种灵活的方式组装起来。通过使用Ninject软件架构,会使你的代码变得更加容易编写、重用性强、易于测试和修改。

 

逐步解说

1、手动依赖性注入

首先让通过一个简单的例子理解下依赖注入的思想。比如说你正在一个游戏,勇士们为荣耀而战。首先我们需要合适的兵器武装我们的勇士。我们先创建Sword(剑)。

    class Sword
{
public void hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}

接着,我们创建类Samurai来描述我们的勇士。为了攻击他们的敌人,我们需要创建一个攻击方法Attack。当这个方法被调用,勇士就会用他的剑攻击他的对手。

    public class Samurai
{
private Sword _sword;
public Samurai()
{
_sword = new Sword();
}
public void Attack(string target)
{
_sword.hit(target);
}
}

现在我们就可以创建我们的勇士并且战斗了。

    class Program
{
public static void Main()
{
Samurai warrior = new Samurai();
warrior.Attack("the evildoers");
}

}

这时控制台会输出“Chopped the evildoers clean in half to the console”。这个工程刚刚好,但是如果我们想用其它的武器武装我们的勇士,该如何做呢?因为Sword 对象在Samurai的构造函数中被创建,所以我们不得不修改类的实现。

当一个类依赖一个实体,被叫做紧耦合。在这个例子里,Samurai类相对于Sword类是紧耦合的。当类是紧耦合,在没有改变实现的情况下,被依赖项是不能别交换的。为了避免紧耦合,我们可以使用接口提供间接层。创建一个接口来描述兵器。

interface Iweapon
{
void Hit(string target);
}

 

接下来我们的Sword 类继承Iweapon接口

class Sword:Iweapon
{
public void hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}

修改我们的 Samurai 类

public class Samurai
{
private Iweapon _weapon;
public Samurai()
{
_weapon = new Sword();
}
public void Attack(string target)
{
_weapon.hit(target);
}
}

现在勇士可以使用不同的兵器了。但是Sword还是在Samurai的构造函数中被创建了。为了让Sword勇士使用其它的兵器,我们还是要修改类的实现。Samurai 类相对于Sword类还是紧耦合的。

幸运的,有个更简单的解决方案。那就是把Sword作为参数传递给Samurai的构造函数。

 class Samurai
{
private Iweapon _weapon;
public Samurai(Iweapon weapon)
{
_weapon = weapon;
}
public void Attack(string target)
{
_weapon.hit(target);
}
}

这时候我们可以凭借Samurai的构造函数进行注入。这是个依赖性注入的例子。让我们再创建个其它的兵器(weapon)镖,给我们的勇士(Samurai)使用。

public class Shuriken : Iweapon
{
public void hit(string target)
{
Console.WriteLine("Pierced {0}'s armor", target);
}
}

我们可以创建一个军队

class Program
{
public static void Main()
{
Samurai warrior1 = new Samurai(new Shuriken());
Samurai warrior2 = new Samurai(new Sword());
warrior1.Attack("the evildoers");
warrior2.Attack("the evildoers");
Console.Read();
}
}

输出结果如下:



这就是手动依赖性注入。你每次创建一个Samurai,首先要创建一些实现了IWeapon接口的对象,传递给Samurai的构造函数。现在我们改变勇士使用的武器,就不用再修改Samurai类了。Samurai是被分离出来的,我们就创建新的武器而不关心Samurai的代码。

手动依赖性注入对小的项目来说是有效的策略,但是随着你应用程序的大小和复杂性的增长,关联对象将变得越来越臃肿。当依赖有自己的依赖会发生什么呢?你可以终止花费大量的时间来创建和关联对象,用更多的时候写有意义的代码。

这就是Ninject可以帮助你的地方。

 

总结:英语学的不好,看着费劲啊!!!翻译不好的地方还请大家多多指教。

英文链接地址:

http://ninject.codeplex.com/wikipage?title=Dependency%20Injection%20By%20Hand&referringTitle=User%20Guide



推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
author-avatar
手机用户2502938985
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有