初试TinyIoCContainer笔记

简介: 第一次看到TinyIoCContainer是在用NancyFx的时候,在Bootstrapper那里看到了她的影子。 那些叫Tiny的东西都挺有意思,IoC容器是我第一次遇到,于是找了些文章看了看,自己写了点代码实践下,这件事就算这么过了,然后今天想起来,在做下笔记。

第一次看到TinyIoCContainer是在用NancyFx的时候,在Bootstrapper那里看到了她的影子。

那些叫Tiny的东西都挺有意思,IoC容器是我第一次遇到,于是找了些文章看了看,自己写了点代码实践下,这件事就算这么过了,然后今天想起来,在做下笔记。

首先是DIP的概念:依赖倒置原则,OOD的产物。

那么IoC就是DIP的实现方式,用我粗糙的话来说就是类依赖抽象就不在类内部自己new,交给别人new好了再用。

来一个应用场景:

  玩家玩游戏机。

代码差不多这样:

 1     interface IGameMachine
 2     {
 3         void Launch();
 4     }
 5 
 6     class Player
 7     {
 8         public IGameMachine GameMachine;
 9 
10         public void Play()
11         {
12        if(GameMachine!=null)
13               GameMachine.Launch();
14         }
15     }
16 
17     class PS3 : IGameMachine
18     {
19         public void Launch()
20         {
21             Console.WriteLine("索尼大法好,PS3开起来啦!");
22         }
23     }

 

这里定义了一个Player类表示玩家,玩家玩的是游戏机,并不指定是什么游戏机,所以有个可以“跑”的游戏机接口,PS3实现了这个接口。那么我就可以在通过赋值更换玩家手上的游戏机来玩PS3了。

1  Player player = new Player();
2  player.GameMachine = new PS3();
3  player.Play();

这样就实现了上面说的“不在类内部new,交给别人new”这一点。

交给TinyIoCContainer来完成就是这样:

1  TinyIoCContainer tiny = new TinyIoCContainer();
2  tiny.Register<IGameMachine, PS3>();
3  Player player = new Player
4  {
5    GameMachine = tiny.Resolve<IGameMachine>()
6  };
7  player.Play();

大多数情况下,在项目中遇到的还没这种可能随时更换的,而是一旦启动就不更换的组件,像数据库之类的,这样的情况下,这个接口成员就可以不public出来,而是private并且通过构造函数初始化。

还是同样的应用场景,只是玩家都变得很穷很穷了,一辈子就只能买一台游戏机。改造下Player类之后,我们可以这样使用TinyIoCContainer了:

    class Player
    {
        private readonly IGameMachine _gameMachine;

        public Player(IGameMachine gameMachine)
        {
            _gameMachine = gameMachine;
        }

        public void Play()
        {
            if (_gameMachine != null)
                _gameMachine.Launch();
            else
                Console.WriteLine("没初始化");
        }
    }

    static void Main(string[] args)
    {
        TinyIoCContainer tiny = new TinyIoCContainer();
        tiny.Register<IGameMachine, PS3>();
        Player player = tiny.Resolve<Player>();
        player.Play();
        Console.ReadLine();
    }

哈,这里只是注册了IGameMachine对应PS3,也可以Resolve出Player来,并且通过构造函数创建了PS3呢。

于是,再进一步想一下,假如GameMachine也有依赖的抽象需要实现呢?

那么应用场景再进一步调整:

玩家有一台游戏机,游戏机可以插各种游戏卡带

那么游戏机就有了一个属性游戏卡带,我也希望游戏卡带能通过构造函数初始化。上面说过的DIP的概念只是说依赖抽象,所以,游戏机从接口抽象改成了抽象类。

 1     class GameBoy : GameMachine
 2     {
 3         protected override void OnPlay()
 4         {
 5             Console.WriteLine("我是任饭,我玩GameBoy!");
 6         }
 7 
 8         public GameBoy(GameCard currentCard) : base(currentCard)
 9         {
10 
11         }
12     }
13 
14     abstract class GameMachine
15     {
16         private GameCard _currentCard;
17 
18         protected GameMachine(GameCard currentCard)
19         {
20             _currentCard = currentCard;
21         }
22 
23         public void Launch()
24         {
25             OnPlay();
26             Console.WriteLine("我在玩{0}", _currentCard.Name);
27         }
28 
29         protected abstract void OnPlay();
30     }
31 
32     public abstract class GameCard
33     {
34         public abstract string Name { get; }
35     }
36 
37     public class PoketMonster:GameCard
38     {
39         public override string Name
40         {
41             get { return "口袋蓝"; }
42         }
43     }

稍微更改下Player类,替换接口IGameMachine成抽象类GameMachine。

那么使用的时候,我们在容器中注册GameCard为PoketMonster,GameMachine为GameBoy试试看。

 1     static void Main(string[] args)
 2     {
 3         TinyIoCContainer tiny = new TinyIoCContainer();
 4         tiny.Register<GameMachine, GameBoy>();
 5         tiny.Register<GameCard, 口袋妖怪>();
 6 
 7         Player p = tiny.Resolve<Player>();
 8         p.Play();
 9 
10         Console.ReadLine();
11     }

运行输出

 

目录
相关文章
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习(11)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊-除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 人工智能 算法
2024重生之回溯数据结构与算法系列学习(7)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人数据结构与算法系列学习之队列的基本概念、如何判断队列已满/已空、队列的链式存储结构[头的出入队]、双端队列、中缀、后缀、前缀表达式、特殊矩阵和一二维数组的压缩储存等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
7月前
|
算法 C++
小唐蓝桥的做题心得
小唐蓝桥的做题心得
|
机器学习/深度学习 存储 算法
写给小白看的硬核递归(低调点,当回小白)
递归:就是函数自己调用自己。 子问题须与原始问题为同样的事,或者更为简单。 递归通常可以简单的处理子问题,但是不一定是最好的解决方式。
96 0
写给小白看的硬核递归(低调点,当回小白)
|
前端开发
#yyds干货盘点# 前端歌谣的刷题之路-第八十四题-计时器
#yyds干货盘点# 前端歌谣的刷题之路-第八十四题-计时器
89 0
#yyds干货盘点# 前端歌谣的刷题之路-第八十四题-计时器
|
前端开发
#yyds干货盘点# 前端歌谣的刷题之路-第三十三题-或运算
#yyds干货盘点# 前端歌谣的刷题之路-第三十三题-或运算
46 0
#yyds干货盘点# 前端歌谣的刷题之路-第三十三题-或运算
|
前端开发
#yyds干货盘点 前端歌谣的刷题之路-第十三题-画一个圆
#yyds干货盘点 前端歌谣的刷题之路-第十三题-画一个圆
81 0
#yyds干货盘点 前端歌谣的刷题之路-第十三题-画一个圆
|
算法 大数据
【蓝桥真题5】带三百人训练了十天精选蓝桥真题,看看他们都练些什么(三门语言题解)(中)
【蓝桥真题5】带三百人训练了十天精选蓝桥真题,看看他们都练些什么(三门语言题解)
114 0
【蓝桥真题5】带三百人训练了十天精选蓝桥真题,看看他们都练些什么(三门语言题解)(中)
下一篇
DataWorks