如果你是开发大牛,可以评论指正,如果你是新手,对依赖注入摸不到头绪,又或者看了许多大牛的博文,却发现一脸懵逼,那么把你懵逼的脸转过来,这里你可能会找到一点感悟,或者,你想象中非常复杂的东西其实没有那么恐怖,而真正恐怖的应该是中国的那些喜欢故弄玄虚的所谓的大牛前辈们!
本文采用.net语言来进行解释,和你以往看到的教程不同,我们先看实例,再讲概念。
一:实例:传奇游戏代言
如果你是游戏开发商,在初期的时候,秀逗的你为了让自己的游戏让更多人看到了解,最后进行注册,可能会去请许多明星来进行代言。第一次,你找了angelabay代言,没办法,人家火呀。于是发生了这样的场景。
传奇:你好,我想让你给我的游戏代言,因为您的形象特别好呢。
angelababy:ok,木有问题,钱多钱少也不是问题,只要你肯砸钱让我经常在网上露脸就行。
传奇:哇塞,真是遇到好人了,一切听您安排。
angelababt:各单位无条件服从我的命令(注意,此时的控制权在angelababy手中),于是各种代言词开始被pass,重写,pass,重写,最终经过长达半年的选词,代言完成。
开发商事后感悟:虽然麻烦,耗费了大量资金和时间,但是真值!薄利多销的道理我还是懂得的,所以,我要再找一个明星代言!
于是我们的春哥陈小春被选中了,同样的流程,长达半年的时间过去了,代言形象深入人心呀!
然而传奇老板这次似乎有点感悟了,为什么明明是双赢的事,自己却被牵着鼻子走呢?
这一夜,传奇老板做了一个梦,他梦到了乔布斯!乔布斯告诉他,直起腰板,你是金主,你说的算!把控制权要回来!
于是,控制反转发生了,传奇老板疯了一样大刀阔斧的修改经营模式。所有人听我号令,剧本,代言词先准备好,哪个明星愿意来,就必须给我老实的读剧本!
于是发生了接下来的一幕,代言大户聪哥来了,剧本的读的很6,短短一天的时间,代言完成,传奇老板站在窗外,深吸一口气:控制反转真强大呀,我要弄一个明星库,给他们编号。于是大量明星的信息被收录进了明星库,而这个明星库就是我们说的容器,IOC容器!
传奇老板:这下万无一失了,我把这些明星信息注入到明星库里,有一天,我要打败麻花腾!
故事结束。
没错,控制反转和IOC容器就是这么回事,小伙伴,有感觉了没有,好,开始讲概念。
2.控制反转和IOC容器
官方解释,虽然我也看不懂,但是没办法,复制粘贴过来,劝你还是僵尸读一样的过一遍。
控制反转(IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(DI)
ioc容器就不多解释了,就是个大盒子。
3.传奇案例,代码实现之不使用依赖注入
首先明确一点,传奇依赖于明星代言,我们先建几个明星类。
public class Angelababy
{
public void Speak()
{
Console.WriteLine("点我玩真的传奇游戏,我是Angelababy,我在传奇等你哦!");
}
}
public class ChenXiaoChun
{
public void Speak()
{
Console.WriteLine("我是陈小春,我在传奇等你,是兄弟,就来砍我吧!");
}
}
接着是传奇类:
//此时是baby代言
public class Game
{
public void Speak()
{
Angelababy angelababy=new Angelababy ();
angelababy.Speak();
}
}
//此时是春哥代言
public class Game
{
//此时是baby代言
public void Speak()
{
ChenXiaoChun chenxiaochun=new ChenXiaoChun();
chenxiaochun.Speak();
}
}
看到这里,有的小伙伴可能会觉得,还好啊,逻辑清晰,书写规范,是我喜欢的代码,
可是想一下,如果后期再来七八十个明星,你的代码就会变成贪吃蛇的尾巴了。这还是不最可怕的,毕竟贪吃蛇再长,也可以复制,但是如果明星的详细资料你都要改变呢,你是不是要跑回去把明星资料以及明星关联的一些特定操作都要改一遍呢?不给自己抬杠了,继续。
4 传奇案例,代码实现之使用依赖注入
这次我们会先建立一个明星库,也就是ioc容器,注意,这个容器我们会选择接口的方式来实现,你也可以弄个实体类基类来做ioc,前提是你不嫌麻烦。
//这就是最原始的容器,你没有看错,明星都听我的号令,就给你们一个开口说话的权力,爱干不干
public interface IStars
{
void Speak();
}
接着,我们要开始向容器里注入明星信息了
public class Angelababy : IStars
{
public void Speak()
{
Console.WriteLine("点我玩真的传奇游戏,我是Angelababy,我在魔域等你哦!");
}
}
public class ChenXiaoChun : IStars
{
public void Speak()
{
Console.WriteLine("我是陈小春,我在传奇等你,是兄弟,就来砍我吧!");
}
}
到了这里,我们的容器就ok了,接下来是游戏类了。
public class Game
{
//这里给个注解:没错,就是把最原始的接口容器当作变量一样定义在游戏里,明星属于游戏的一
部分,而 不是游戏完全依赖于明星了,这个思想,你要体会一下
public IStars _Istars { get; set; }
//重写构造,将接口当作参数,再次赋值给接口容器,他俩看似一样,其实不然,因为属性不会变,
参数却是会改变哦
public Game(IStars Stars)
{
this._Istars = Stars;
}
//游戏里属于自己的代言方法,方法就是让明星没毛病说两句
public void DaiYan()
{
_Istars.Speak();
}
}
至此,依赖注入完成了,有强迫症的你可能会问,怎么调用呢?
代码在此:
class Program
{
static void Main(string[] args)
{
//这里的baby很委屈的被new了过来,没办法,需要流量呀
Angelababy Angelababy = new Angelababy();
//传奇把baby放入了自己的规划蓝图之中
Game ChuanQi = new Game(Angelababy);
//传奇开机,代言开始
//发现没有,不是调用的明星的代言方法了,而是传奇一开机,明星自动说话了,而真相就在上
面的代码中,留给你一点思考空间吧
ChuanQi.DaiYan();
Console.Read();
//接下来是春哥登场,一句代码搞定了呢
new Game(new ChenXiaoChun ()).DaiYan();
Console.Read();
}
}
喜欢点赞,感谢!
回过头来想想,突然感觉哪里不对。。。。5分钟读完。。。好像有点勉强呢。