Swiftsuspenders2 是一个基于元数据(metadata)的IOC(控制反转,inversion of control)的AS3的解决方案。反转控制又被称依赖注射(Dependency Injection),也就是将依赖先剥离,然后在适当时候再注射进入。它是一种降低耦合度的程序设计模式其核心原则是高层模块不应依赖于低层模块,他们都应该依赖于抽象。抽象不依赖细节,细节依赖抽象,它通过将对象的创建过程解耦出来来降低对象间的依赖关系。IOC的设计目标是不直接创建对象,但是描述对象的创建方式,在代码中不直接链接对象和服务,通过配置的方式描述哪一种组件需要哪一些服务,然后在ioc容器中负责自动将对象服务和需要使用他们的地方进行链接。下面我们通过一个简单的例子,先了解一下如何利用依赖注入进行解耦。
关于依赖注入
当我们需要进行一个发送消息或者邮件的流程时 我们可能会写如下代码(demo0):
1 package demo0 2 { 3 /** 4 * ... 5 * @author titi 6 */ 7 public class Mail 8 { 9 public var Title:String; 10 11 public function Send():void 12 { 13 trace(" Send Mail:"+Title); 14 } 15 16 public function Mail(title:String) 17 { 18 Title = title; 19 } 20 21 } 22 23 } 24 25 26 package demo0 27 { 28 /** 29 * ... 30 * @author titi 31 */ 32 public class Notification 33 { 34 private var _email:Mail; 35 public function Notification() 36 { 37 _email = new Mail("测试邮件1"); 38 } 39 40 41 public function PromotionalNotification():void 42 { 43 _email.Send(); 44 } 45 } 46 47 } 48 49 50 package demo0 51 { 52 import flash.display.Sprite; 53 import flash.events.Event; 54 55 /** 56 * ... 57 * @author titi 58 */ 59 public class Main0 extends Sprite 60 { 61 62 public function Main0():void 63 { 64 if (stage) init(); 65 else addEventListener(Event.ADDED_TO_STAGE, init); 66 } 67 68 private function init(e:Event = null):void 69 { 70 removeEventListener(Event.ADDED_TO_STAGE, init); 71 // entry point 72 var notificatoin:Notification = new Notification(); 73 notificatoin.PromotionalNotification(); 74 } 75 76 } 77 78 }