Ninject学习(一) - Dependency Injection By Hand
大体上是把官网上的翻译下而已。
http://www.ninject.90iogjkdcrorg/wiki.html
Dependency Injection By Hand
So what’s Ninject all about? First, let’s examine the idea of dependency injection by walking through a simple example. Let’s say you’re writing the next blockbuster game, where noble warriors do battle for great glory. First, we’ll need a weapon suitable for arming our warriors.
所以Ninject到底是什么?首先,让我们来试验一个依赖注入实例。例如你正在写一个惊天地泣鬼神的游戏,忍者大大(鸣人)为了伟大的荣誉而战,我们需要为我们的武士(下忍们)装备武器。
class Sword
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
Then, let’s create a class to represent our warriors themselves. In order to attack its foes, the warrior will need an Attack() method. When this method is called, it should use its Sword to strike its opponent.
然后让我们新建一个类来代表武士。为了能够进攻敌人,武士类需要一个Attack()方法。当方法被调用的时候,方法应该调用Sword类攻击敌人。
class Samurai
{
readonly Sword sword;
public Samurai()
{
this.sword = new Sword();
} public void Attack(string target)
{
this.sword.Hit(target);
}
}
Now, we can create our Samurai and do battle!
现在,我们可以新建一个武士来作战了!
class Program
{
public static void Main()
{
var warrior = new Samurai();
warrior.Attack("the evildoers");
}
}
As you might imagine, this will print Chopped the evildoers clean in half to the console. This works just fine, but what if we wanted to arm our Samurai with another weapon? Since the Sword is created inside the Samurai class’s constructor, we have to modify the implementation of the class in order to make this change.
你能想象,控制台将会输出”Chopped the evildoers clean in half“。目前看来一切工作良好,但一旦出现了我们要为武士更换另一种武器的情况怎么办呢?由于剑是新建在武士类的构造器中的,因此为了让武士能够变更武器,我们需要修改整改武士类。
When a class is dependent on a concrete dependency, it is said to be tightly coupled to that class. In this example, the Samurai class is tightly coupled to the Sword class. When classes are tightly coupled, they cannot be interchanged without altering their implementation. In order to avoid tightly coupling classes, we can use interfaces to provide a level of indirection. Let’s create an interface to represent a weapon in our game.
当一个类依赖于一个具体的类时,我们就说这两个类是紧密关联的。在这个例子中,武士类与剑类是紧密关联的。一旦类需要修改时,所依赖的类也需要进行修改。为了避免这种紧密关联的情况,我们可以使用接口来做中间件。让我们来新建一个接口来代表一个武器类。
interface IWeapon
{
void Hit(string target);
}
Then, our Sword class can implement this interface:
然后我们的剑类可以继承这个接口
class Sword : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
And we can alter our Samurai class:
之后我们就能更改我们的武士类
class Samurai
{
readonly IWeapon weapon;
public Samurai()
{
this.weapon = new Sword();
} public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Now our Samurai can be armed with different weapons. But wait! The Sword is still created inside the constructor of Samurai. Since we still need to alter the implementation of Samurai in order to give our warrior another weapon, Samurai is still tightly coupled to Sword.
现在我们的武士类就可以装备不同的武器了。但是等等!剑依然在武士类的构造函数中新建啊~由于我们依然需要修改武士类中的声明才能变更武器,所以武士类和剑类依然是紧密关联的。
Fortunately, there is an easy solution. Rather than creating the Sword from within the constructor of Samurai, we can expose it as a parameter of the constructor instead.
幸运的是,这种情况有一个简单的解决方式。我们可以为构造函数传递一个参数,来替代之前的构造函数。
class Samurai
{
readonly IWeapon weapon;
public Samurai(IWeapon weapon)
{
this.weapon = weapon;
} public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Then, to arm our warrior, we can inject the Sword via the Samurai ‘s constructor. This is an example of dependency injection (specifically, constructor injection). Let’s create another weapon that our Samurai could use:
之后就可以武装我们的武士了,我们可以通过武士类的构造函数注入剑类。这个依赖注入的例子展示的是构造器注入。现在让我们新建一个武士可以使用的飞镖类:
class Shuriken : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Pierced {0}'s armor", target);
}
}
Now, we can create an army of warriors:
现在,我们可以新建一个装备的武士了:
class Program
{
public static void Main()
{
var warrior1 = new Samurai(new Shuriken());
var warrior2 = new Samurai(new Sword());
warrior1.Attack("the evildoers");
warrior2.Attack("the evildoers");
}
}
This results in the following output to be printed to the console:
结果就是输出以下内容:
【Pierced the evildoers armor.
Chopped the evildoers clean in half.】
This is called dependency injection by hand, because each time you want to create a Samurai, you must first create some implementation of IWeapon and then pass it to the constructor of Samurai. Now that we can change the weapon the Samurai uses without having to modify its implementation, the Samurai class could be in a separate assembly from Sword – in fact, we can create new weapons without needing the source code of the Samurai class!
这个例子就是手动依赖注入,因为每次你需要新建一个武士类,你必须首先新建一些IWeapon的继承类,然后把继承类传递给武士类的构造器。现在我们可以为武士类变更武器而不需要修改IWeapon的继承了,武士类可以单独组装剑类了,实际上我们可以新建新的武器而不需要修改武士类的源代码了!
Dependency injection by hand is an effective strategy for small projects, but as your application grows in size and complexity, it becomes more and more cumbersome to wire all of your objects up. What happens when the dependencies have dependencies of their own? What happens when you want to add a (e.g. caching, tracing to a log, auditing etc.) decorator in front of each instance of a given dependency? You can easily end up spending most of your time creating and wiring together objects, when you could be writing code that adds real value to your software. This is where dependency injection libraries / frameworks like Ninject can help.
手动依赖注入对于小型项目是一个有效的方式,但是一旦你的项目越来越大、越来越复杂,手动依赖注入会变成越来越笨重、越来越难以维护。这个时候就需要依赖注入的项目(Ninject)了。
Ninject学习(一) - Dependency Injection By Hand的更多相关文章
- AngularJs学习笔记--Dependency Injection(DI,依赖注入)
原版地址:http://code.angularjs.org/1.0.2/docs/guide/di 一.Dependency Injection(依赖注入) 依赖注入(DI)是一个软件设计模式,处理 ...
- spring in action学习笔记一:DI(Dependency Injection)依赖注入之CI(Constructor Injection)构造器注入
一:这里先说一下DI(Dependency Injection)依赖注入有种表现形式:一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) ...
- MVC Controller Dependency Injection for Beginners【翻译】
在codeproject看到一篇文章,群里的一个朋友要帮忙我翻译一下顺便贴出来,这篇文章适合新手,也算是对MEF的一个简单用法的介绍. Introduction In a simple stateme ...
- 【译】Dependency Injection with Autofac
先说下为什么翻译这篇文章,既定的方向是架构,然后为了学习架构就去学习一些架构模式.设计思想. 突然有一天发现依赖注入这种技能.为了使得架构可测试.易维护.可扩展,需要架构设计为松耦合类型,简单的说也就 ...
- Ninject学习笔记<二>
本文转载自kuangkro 如果给您带来不便请联系博主 一.控制反转和依赖注入 Ninject是一个轻量级的基于.Net平台的依赖注入(IOC)框架.所谓的IOC,即控制反转(Inversion of ...
- Ninject学习笔记<一>
本文转载自永远的阿哲 如果给您带来不便请联系博主. Ninject是一款.Net平台下的开源依赖注入框架.按照官方说法,它快如闪电.超级轻量,且充分利用了.Net的最新语法,使用Lambda表达式代替 ...
- Json.NET Updates: Merge, Dependency Injection, F# and JSONPath Support
Json.NET 6.0 received 4 releases this year, the latest last week. Over these releases, several new f ...
- Dependency Injection in ASP.NET Web API 2 Using Unity
What is Dependency Injection? A dependency is any object that another object requires. For example, ...
- [LINK]List of .NET Dependency Injection Containers (IOC)
http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx I'm trying to expand my ...
随机推荐
- Medial Queries的另一用法——实现IE hack
众所周知,有些时候为了实现IE下的某些效果与现代浏览器一致,我们不得不使用一些hack手段来实现目的.比如说使用"\0","\"和"\9"来 ...
- visual studio 2013 使用域名调试本地项目
一.在localhost添加需要指定的域名,如:test.domain.com 二.以管理员身份启动VS,并打开项目 三.修改IIS Express的配置文件(一般位于:C:\Users\当前用户\D ...
- CSS Icon 项目地址 小图标-用css写成的
http://cssicon.space/#/icon/focus 这是所有用css写成的 小图标 右侧有 html和css代码
- 【20160722-20160728】NOI2016滚粗记&&酱油记&&游记
先挖坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.c ...
- ActiveMQ入门
ActiveMQ简介 概要 开源 JMS-compliant 消息中间件message-oriented middleware(MOM) 松耦合,相对于RPC的紧耦合 发送消息fire-and-for ...
- synergy 使用记录
synergy 是一个多台电脑之间,共享鼠标.键盘的开源工具,做的很赞.目前,这个工具对 Windows.Linux.MacOS 都有很好的支持. 手上 arm 板安装的是 debian 系统,所以, ...
- 【原】小玩node+express爬虫-1
最近开始重新学习node.js,之前学的都忘了.所以准备重新学一下,那么,先从一个简单的爬虫开始吧. 什么是爬虫 百度百科的解释: 爬虫即网络爬虫,是一种自动获取网页内容的程序.是搜索引擎的重要组成部 ...
- CSS-学习笔记三
绝对定位:1. 脱离了文档流,没有浮动效果2. 默认情况下,设置了绝对定位的块,它的Top,left是相对于浏览器的3. 当给设置了绝对定位的块的父元素设置定位的时候(绝对.相对.固定), 那么 ...
- tomcat 动态部署
还可以在conf目录下依次创建Catalina\localhost目录,然后在localhost目录下为 test 这个Web应用程序建立 test.xml 文件,编辑这个文件输入以下内容 从Tomc ...
- Quartz.NET总结(五)基于Quartz.net 的开源任务管理平台
前面总结了很多,关于Quartz.net 的文章,介绍了如何使用Quartz.net.不清楚的朋友,可以看我之前的系列文章,http://www.cnblogs.com/zhangweizhong/c ...