目录

目录

1 IGame游戏公司的故事

    1.1 讨论会

    1.2 实习生小李的实现方法

    1.3 架构师的建议

    1.4 小李的小结

2 探究依赖注入

    2.1 故事的启迪

    2.2 正式定义依赖注入

3 依赖注入那些事儿

    3.1 依赖注入的类别

        3.1.1 Setter注入

        3.1.2 Construtor注入

        3.1.3 依赖获取

    3.2 反射与依赖注入

    3.3 多态的活性与依赖注入

        3.3.1 多态性的活性

        3.3.2 不同活性多态性依赖注入的选择

4 IoC Container

    4.1 IoC Container出现的必然性

    4.2 IoC Container的分类

        4.2.1 重量级IoC Container

        4.2.2 轻量级IoC Container

    4.3 .NET平台上典型IoC Container推介

        4.3.1 Spring.NET

        4.3.2 Unity

参考文献

1 IGame游戏公司的故事

1.1 讨论会

话说有一个叫IGame的游戏公司,正在开发一款ARPG游戏(动作&角色扮演类游戏,如魔兽世界、梦幻西游这一类的游戏)。一般这类游戏都有一个基本的功能,就是打怪(玩家攻击怪物,借此获得经验、虚拟货币和虚拟装备),并且根据玩家角色所装备的武器不同,攻击效果也不同。这天,IGame公司的开发小组正在开会对打怪功能中的某一个功能点如何实现进行讨论,他们面前的大屏幕上是这样一份需求描述的ppt:

[转]依赖注入那些事儿

图1.1 需求描述ppt

各个开发人员,面对这份需求,展开了热烈的讨论,下面我们看看讨论会上都发生了什么。

1.2 实习生小李的实现方式

在经过一番讨论后,项目组长Peter觉得有必要整理一下各方的意见,他首先询问小李的看法。小李是某学校计算机系大三学生,对游戏开发特别感兴趣,目前是IGame公司的一名实习生。

经过短暂的思考,小李阐述了自己的意见:

“我认为,这个需求可以这么实现。HP当然是怪物的一个属性成员,而武器是角色的一个属性成员,类型可以使字符串,用于描述目前角色所装备的武器。角色类有一个攻击方法,以被攻击怪物为参数,当实施一次攻击时,攻击方法被调用,而这个方法首先判断当前角色装备了什么武器,然后据此对被攻击怪物的HP进行操作,以产生不同效果。”

而在阐述完后,小李也飞快的在自己的电脑上写了一个Demo,来演示他的想法,Demo代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
   5:  
namespace IGameLi
   7: {
/// <summary>
/// 怪物
/// </summary>
class Monster
  12:     {
/// <summary>
/// 怪物的名字
/// </summary>
public String Name { get; set; }
  17:  
/// <summary>
/// 怪物的生命值
/// </summary>
public Int32 HP { get; set; }
  22:  
public Monster(String name,Int32 hp)
  24:         {
this.Name = name;
this.HP = hp;
  27:         }
  28:     }
  29: }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
  34:  
namespace IGameLi
  36: {
/// <summary>
/// 角色
/// </summary>
class Role
  41:     {
new Random();
  43:  
/// <summary>
/// 表示角色目前所持武器的字符串
/// </summary>
public String WeaponTag { get; set; }
  48:  
/// <summary>
/// 攻击怪物
/// </summary>
void Attack(Monster monster)
  54:         {
if (monster.HP <= 0)
  56:             {
);
return;
  59:             }
  60:  
this.WeaponTag)
  62:             {
  63:                 monster.HP -= 20;
if (monster.HP <= 0)
  65:                 {
);
  67:                 }
else
  69:                 {
);
  71:                 }
  72:             }
this.WeaponTag)
  74:             {
  75:                 monster.HP -= 50;
if (monster.HP <= 0)
  77:                 {
);
  79:                 }
else
  81:                 {
);
  83:                 }
  84:             }
this.WeaponTag)
  86:             {
  87:                 Int32 loss = (_random.NextDouble() < 0.5) ? 100 : 200;
  88:                 monster.HP -= loss;
if (200 == loss)
  90:                 {
);
  92:                 }
  93:  
if (monster.HP <= 0)
  95:                 {
);
  97:                 }
else
  99:                 {
);
 101:                 }
 102:             }
else
 104:             {
);
 106:             }
 107:         }
 108:     }
 109: }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 114:  
namespace IGameLi
 116: {
class Program
 118:     {
string[] args)
 120:         {
//生成怪物
, 50);
, 50);
, 200);
, 1000);
 126:  
//生成角色
new Role();
 129:  
//木剑攻击
;
 132:             role.Attack(monster1);
 133:  
//铁剑攻击
;
 136:             role.Attack(monster2);
 137:             role.Attack(monster3);
 138:  
//魔剑攻击
;
 141:             role.Attack(monster3);
 142:             role.Attack(monster4);
 143:             role.Attack(monster4);
 144:             role.Attack(monster4);
 145:             role.Attack(monster4);
 146:             role.Attack(monster4);
 147:  
 148:             Console.ReadLine();
 149:         }
 150:     }
 151: }

相关文章: