Swiftsuspenders2 是一个基于元数据(metadata)的IOC(控制反转,inversion of control)的AS3的解决方案。反转控制又被称依赖注射(Dependency Injection),也就是将依赖先剥离,然后在适当时候再注射进入。它是一种降低耦合度的程序设计模式其核心原则是高层模块不应依赖于低层模块,他们都应该依赖于抽象。抽象不依赖细节,细节依赖抽象,它通过将对象的创建过程解耦出来来降低对象间的依赖关系。IOC的设计目标是不直接创建对象,但是描述对象的创建方式,在代码中不直接链接对象和服务,通过配置的方式描述哪一种组件需要哪一些服务,然后在ioc容器中负责自动将对象服务和需要使用他们的地方进行链接。下面我们通过一个简单的例子,先了解一下如何利用依赖注入进行解耦。

关于依赖注入

当我们需要进行一个发送消息或者邮件的流程时 我们可能会写如下代码(demo0):

 package  demo0
{
/**
* ...
* @author titi
*/
public class Mail
{
public var Title:String; public function Send():void
{
trace(" Send Mail:"+Title);
} public function Mail(title:String)
{
Title = title;
} }   }
  
  
package demo0
{
/**
* ...
* @author titi
*/
public class Notification
{
private var _email:Mail;
public function Notification()
{
_email = new Mail("测试邮件1");
} public function PromotionalNotification():void
{
_email.Send();
}
}   }
  
  
package demo0
{
import flash.display.Sprite;
import flash.events.Event; /**
* ...
* @author titi
*/
public class Main0 extends Sprite
{ public function Main0():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
} private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var notificatoin:Notification = new Notification();
notificatoin.PromotionalNotification();
} }   }

这里Mail和其控制器Notification 是直接关联的,控制器依赖Mail对象。通过抽象Mail 可以进行解耦降低Notification和Mail的耦合度。

 package demo1
{ /**
* ...
* @author titi
*/
public interface IMsg
{
function set Title(value:String):void; function get Title():String; function Send():void;
} }
  
package demo1
{
/**
* ...
* @author titi
*/
public class Mail implements IMsg
{
public var _Title:String; public function Send():void
{
trace(" Send Mail:"+Title);
} public function Mail(title:String)
{
_Title = title;
} /* INTERFACE demo1.IMsg */ public function set Title(value:String):void
{
_Title = value;
} public function get Title():String
{
return _Title;
} } } package demo1
{
/**
* ...
* @author titi
*/
public class Notification
{
private var _email:IMsg; public function PromotionalNotification():void
{
_email.Send();
}
} }

抽象后 可以通过四种方式(注入点) 在Notification 中注入IMail对应的具体的Mail 分别是

1、构造函数注入

 package  demo1
{
/**
* ...
* @author titi
*/
public class Notification
{
private var _email:IMsg;
public function Notification(email:IMsg)
{
_email = email;
} public function PromotionalNotification():void
{
_email.Send();
}
} }

2、方法注入

 package  demo1
{
/**
* ...
* @author titi
*/
public class Notification3
{
private var _email:IMsg; public function Notification3()
{ } public function PromotionalNotification(mail:IMsg):void
{
mail.Send();
}
} }

3、属性注入

 package  demo1
{
/**
* ...
* @author titi
*/
public class Notification2
{
private var _email:IMsg; public function Notification2()
{ } public function PromotionalNotification():void
{
_email.Send();
} //提供供外部注入Set属性
public function set email(value:IMsg):void
{
_email = value;
}
} }

4、变量注入

 package  demo1
{
/**
* ...
* @author titi
*/
public class Notification4
{
/**
* 公共变量提供抽象注入
*/
public var _email:IMsg; public function Notification4()
{ } public function PromotionalNotification():void
{
_email.Send();
} } }

在Demo1中我们用如下代码来进行显示的抽象注入:

 package demo1
{
import flash.display.Sprite;
import flash.events.Event; /**
* ...
* @author titi
*/
public class Main1 extends Sprite
{ public function Main1():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
} private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point //构造依赖
var notificatoin:Notification = new Notification(new Mail("测试邮件1"));
notificatoin.PromotionalNotification();
//属性依赖
var notificatoin2:Notification2 = new Notification2();
notificatoin2.email = new Mail("测试邮件2");
notificatoin2.PromotionalNotification();
//方法依赖
var notificatoin3:Notification3 = new Notification3();
notificatoin3.PromotionalNotification(new Mail("测试邮件3"));
//变量依赖
var notificatoin4:Notification4 = new Notification4();
notificatoin4._email=new Mail("测试邮件4")
notificatoin4.PromotionalNotification();
} } }

执行后输出如下:

  Send Mail:测试邮件1
Send Mail:测试邮件2
Send Mail:测试邮件3
Send Mail:测试邮件4

上面2个demo大致说明了如何通过依赖注入对现有的逻辑进行解耦,接下来我们用Swiftsuspenders2框架来快速实现上述的demo1作为对Swiftsuspenders2框架的入门详细参考如下demo2代码。

 package  demo2
{
/**
* ...
* @author titi
*/ [Inject(name="email1")]
public class Notification
{
private var _email:IMsg;
public function Notification(email:IMsg)
{
_email = email;
} public function PromotionalNotification():void
{
_email.Send();
}
} } package demo2
{
/**
* ...
* @author titi
*/
public class Notification2
{
private var _email:IMsg; public function Notification2()
{ } public function PromotionalNotification():void
{
_email.Send();
} public function get email():IMsg
{
return _email;
} [Inject(name="email2")]
public function set email(value:IMsg):void
{
_email = value;
}
} }
package demo2
{
/**
* ...
* @author titi
*/
public class Notification3
{
private var _email:IMsg; public function Notification3()
{ } [Inject(name = "email3")]
public function inject(mail:IMsg):void
{
_email = mail;
} public function PromotionalNotification():void
{
_email.Send();
}
} } package demo2
{
/**
* ...
* @author titi
*/
public class Notification4
{
/**
* 公共变量提供抽象注入
*/ [Inject(name = "email4")]
public var _email:IMsg; public function Notification4()
{ } public function PromotionalNotification():void
{
_email.Send();
} } } package demo2
{
import flash.display.Sprite;
import flash.events.Event;
import org.swiftsuspenders.Injector; /**
* ...
* @author titi
*/
public class Main2 extends Sprite
{ public function Main2():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
} private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point //申明注入器
var injector:Injector = new Injector(); injector.map(IMsg, "email1").toValue(new Mail("测试邮件1"));
injector.map(IMsg, "email2").toValue(new Mail("测试邮件2"));
injector.map(IMsg, "email3").toValue(new Mail("测试邮件3"));
injector.map(IMsg, "email4").toValue(new Mail("测试邮件4")); (injector.instantiateUnmapped(Notification) as Notification).PromotionalNotification();
(injector.instantiateUnmapped(Notification2) as Notification2).PromotionalNotification();
(injector.instantiateUnmapped(Notification3) as Notification3).PromotionalNotification();
(injector.instantiateUnmapped(Notification4) as Notification4).PromotionalNotification();
} } }

Robotlegs2 学习笔记 -- SwiftSuspenders 2.x (1)的更多相关文章

  1. Robotlegs2 学习笔记 -- SwiftSuspenders 2.x (2)

    Swiftsuspenders2简介 Swiftsuspenders2是一个基于元数据(metadata)的IOC(控制反转,inversion of control)的AS3的解决方案.(对于元数据 ...

  2. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  3. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  4. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  5. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  6. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  7. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  8. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  9. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

随机推荐

  1. 读书笔记:Sheldon Ross:概率论基础教程:随机变量

    例1b 一个坛子里装有编号1-20的球,无放回抽取3个,取出球中至少一个号码大于等于17的概率是多少? 除了书上的解法外,还有一种解法: 考虑相反的情况:三个球的号码都小于17. 第一次从编号1-16 ...

  2. Config Advisor

    Description: Config Advisor Overview Config Advisor is a configuration validation and health check t ...

  3. SVN设置实例

    D:\scmserver\SVNROOT\safeControl,该SVN项目下,有erSystem和hcSystem两个项目.现在人员有两种类型的人,一个内部人员,一个是佰钧成人员. 设置要求: 1 ...

  4. c++封装编写线程池

    在csapp学习或者其他linux底层编程的过程中,一般都会举一些多线程或多进程的例子,配合底层同步原语.系统调用api来解释怎么创建多线程/多进程. 但是这些例子和实际项目中所用到的多线程/多进程编 ...

  5. 【wp之二 页面布局】

    1. panoramic全景视图 新建工程选择:Windows Phone Panorama Application 相当于用放大镜看报纸的感觉.用一张图片作为背景. 2.pivot透视视图

  6. Codeforces Round #365 (Div. 2) Chris and Road

    Chris and Road 题意: 给一个n个顶点的多边形的车,有速度v,人从0走到对面的w,人速度u,问人最快到w的时间是多少,车如果挡到人,人就不能走. 题解: 这题当时以为计算几何,所以就没做 ...

  7. hdu 5444 Elven Postman 二叉树

    Time Limit: 1500/1000 MS (Java/Others)   Memory Limit: 131072/131072 K (Java/Others) Problem Descrip ...

  8. Java代码规范、格式化和checkstyle检查配置文档

    http://www.blogjava.net/amigoxie/archive/2014/05/31/414287.html 文件下载: http://files.cnblogs.com/files ...

  9. xcode 插件管理工具

    每次xcode 更新后之前安装的插件 都失效了!解决办法: 一.可以通过在原插件项目infoplist新增 新xcode的 DVTPlugInCompatibilityUUID 来使之支持新版xcod ...

  10. ubuntu 命令学习大全

    http://wiki.ubuntu.org.cn/UbuntuSkills#.E6.98.BE.E7.A4.BA.E5.BD.93.E5.89.8D.E7.A1.AC.E4.BB.B6.E4.BF. ...