`
houwei
  • 浏览: 61808 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Flex 开发架构(二): 中央管理-Flex Central Managerment

    博客分类:
  • Flex
阅读更多

 

Flex Chaos-All-in-one这一节中所提到的,在大型项目中,将所有的代码放在一起并非明智之举,确切的讲:正确的方法是将商业逻辑层与UI层分离开来。

 

 

中央管理的理念是使用一个远程对象管理器来控制Flex与后端的通讯。其构建体系如下图所示

 

 

图中每一个UI组件都将调用一个服务(Service),服务类将调用中央管理器(Central Manager),中央管理器类将调用服务器端的解决方案。而图中全局对象管理器(Global Object Manager)将用来在UI之间传递数据。

现在来看看简单密友列表应用的实现。

首先是LoginView.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Panel xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute” width=”300″ height=”200″ horizontalAlign=”center” verticalAlign=”middle” title=”Flex Central Manager Login”>
<mx:Script>
 <![CDATA[
  import com.ny.flex.centralManagement.service.LoginService;
  import mx.validators.Validator;
  import mx.containers.ViewStack;
  import mx.rpc.events.ResultEvent;
  private function login():void{
   if(Validator.validateAll(validators).length == 0){
    LoginService.getInstance().login(username.text,password.text);
   }  
  }
 ]]>
</mx:Script>
 <!–  Validators–>
 <mx:Array id=”validators”>
    <mx:StringValidator  id=”userNameValidator” source=”{username}”  property=”text”  required=”true”/>
    <mx:StringValidator  id=”passwordValidator” source=”{password}”  property=”text” required=”true” />
 </mx:Array>   
<mx:Form id=”loginForm” x=”0″ y=”0″>
          <mx:FormItem label=”Username:” >
               <mx:TextInput id=”username” />
           </mx:FormItem>
           <mx:FormItem label=”Password:” >
               <mx:TextInput id=”password” displayAsPassword=”true” />
           </mx:FormItem>
           <mx:FormItem direction=”horizontal” verticalGap=”15″ paddingTop=”5″ width=”170″>
               <mx:Button id=”loginBtn” label=”Login” click=”login()”/>
           </mx:FormItem>
    </mx:Form>
    
</mx:Panel>

  

 

其功能的核心是:


LoginService.getInstance().login(username.text,password.text); 

 

它的作用是有效的分离了商务逻辑层和视图组件。在此服务类程序不需支持任何状态,因此我们保持其单件模式(singleton)。

LoginService类文件如下:

 

import com.ny.flex.centralManagement.event.DataManagerResultEvent;
 import com.ny.flex.centralManagement.manager.GlobalObjectManager;
 import com.ny.flex.centralManagement.manager.RemoteObjectManager;
 
 public class LoginService
 {
  public var roManager:RemoteObjectManager = null; 
  public var gom:GlobalObjectManager = GlobalObjectManager.getInstance();
  private static var _instance:LoginService =null;
  
  public static function getInstance():LoginService{
   if(_instance == null){
    _instance =  new LoginService(new PrivateClass)
   }
   return _instance;
   
  }
  public function LoginService(privateclass:PrivateClass)
  {
   if(LoginService._instance == null){
    LoginService._instance =  this;
   }
  }
  public function login(userName:String,password:String):void{
 roManager = RemoteObjectManager.getRemoteObjectManager(”flexmvcRO”);
   roManager.addEventListener(”getLoginUser”,loginHandler);
   var params:Array = new Array(userName,password);
   
   roManager.makeRemoteCall(”getLoginUserName”,”getLoginUser”,params);
  }
  private function loginHandler(event:DataManagerResultEvent):void {
   var userName:String = event.result as String;
   if(userName){
    gom.loginUserName = userName;
    gom.viewStackSelectedIndex=1;
   }
  }
 }

  

 

 

 代码中有两个特别的对象:

            RemoteObjectManager

            GlobalObjectManager

RemoteObjectManager是一个单件的类,用来实现中央管理所有的远程对象通讯。原始的代码来自于Jeff Tapper的博客:

Creating a Remote Object DataManager in ActionScript 3.0 for Flex 2.0

 

RemoteObjectManager.as:

package com.ny.flex.centralManagement.manager
{
	import com.ny.flex.centralManagement.event.DataManagerResultEvent;
	
	import flash.events.EventDispatcher;
	
	import mx.core.Application;
	import mx.resources.ResourceManager;
	import mx.rpc.AbstractOperation;
	import mx.rpc.AsyncToken;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.remoting.mxml.RemoteObject;
	
	public class RemoteObjectManager extends EventDispatcher {
		public var ro:RemoteObject;        
		private var eventName:String;         
		
		private static var instanceMap:Object = new Object();    
		     
		public function RemoteObjectManager(pri:PrivateClass,dest:String){            
			this.ro = new RemoteObject();            
			ro.destination = dest;
		}  
		       
		public static function getRemoteObjectManager(dest:String):RemoteObjectManager{
			if(RemoteObjectManager.instanceMap[dest] == null){               
				RemoteObjectManager.instanceMap[dest] = new RemoteObjectManager(new PrivateClass(),dest);          
			}          
			var dm:RemoteObjectManager= RemoteObjectManager.instanceMap[dest];          
			return dm;        
		}
		public function makeRemoteCall(methodName:String,eventName:String,args:Array=null):void{
			this.eventName = eventName;            
			var op:mx.rpc.AbstractOperation = ro[methodName];  
			ro.addEventListener("result", doResults);            
			ro.addEventListener("fault", doFault);    
			var token:AsyncToken = null;        
			if(args && args.length >0){                 
				token = op.send.apply(null,args);            
			}  
			else {
				token = op.send();            
			} 
			token.eventName = eventName;       
		}
		private function doResults(event:ResultEvent):void{             
			var e:DataManagerResultEvent = new DataManagerResultEvent(event.token.eventName, event.result); 
			this.dispatchEvent(e);        
		}         
		private function doFault(fault:FaultEvent):void{             
			this.dispatchEvent(fault);         
		} 
	       
		public override function toString():String{             
			return "RemoteObjectDataManager";         
		}    
	 }
}
 /**   PrivateClass is used to make    DataManager constructor private  */   
  class PrivateClass{
    public function PrivateClass() {} 

 }

 

GlobalObjectManager”用来在UI之间传递信息,例如,我们使用ViewStackselectedIndex来决定显示ViewStack中的哪一个视图,则使用全局对象viewStackSelectedIndex ,其代码如下面的黑体部分:

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml“  xmlns:views=”com.ny.flex.centralManagement.views.*” layout=”absolute”  width=”100%” height=”100%”>
<mx:Script>
 <![CDATA[
  import mx.binding.utils.BindingUtils;
  import com.ny.flex.centralManagement.manager.GlobalObjectManager;
  [Bindable]
  public  var gom:GlobalObjectManager=GlobalObjectManager.getInstance();
 ]]>
</mx:Script>
    <mx:HBox  horizontalAlign=”center” verticalAlign=”top”  width=”100%” height=”100%” y=”0″ x=”0″>
    <mx:ViewStack id=”viewStack”  resizeToContent=”true” selectedIndex=”{gom.viewStackSelectedIndex}” >
        <views:LoginView  />
        <views:BuddyListView/>
    </mx:ViewStack>
    </mx:HBox>
</mx:Application>

 再回头看看在

LoginService
代码中的loginHandler方法,在此viewStackSelectedIndex 全局对象被更新。

LoginService

代码中的loginHandler方法,在此viewStackSelectedIndex 全局对象被更新。

 

 

 private function loginHandler(event:DataManagerResultEvent):void {
   var userName:String = event.result as String;
   if(userName){
    gom.loginUserName = userName;
    gom.viewStackSelectedIndex=1;
   }
  }

 

 

 

[Bindable]元标签使得其值的改变立刻生效。

BuddyList.mxml代码:

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Panel xmlns:mx=”http://www.adobe.com/2006/mxml” title=”Buddy List of {gom.loginUserName}” creationComplete=”init()” width=”500″ height=”320″>
<mx:Script>
 <![CDATA[
  import com.ny.flex.centralManagement.service.BuddyService;
  import com.ny.flex.centralManagement.manager.GlobalObjectManager;
  import mx.collections.ArrayCollection;
  import mx.rpc.events.ResultEvent;
  [Bindable]
  public var gom:GlobalObjectManager = GlobalObjectManager.getInstance();
  
  private function init():void{
   BuddyService.getInstance().getBuddyList();
  }
 ]]>
</mx:Script>

 <mx:DataGrid id=”buddyList”  dataProvider=”{gom.mybuddyList}”  borderStyle=”none” width=”100%” height=”100%” >
       <mx:columns>
        <mx:DataGridColumn dataField=”firstName” headerText=”First Name”/>
        <mx:DataGridColumn dataField=”lastName” headerText=”Last Name”/>
    </mx:columns>

 </mx:DataGrid>
</mx:Panel>

 

 

 

BuddyService是另一个服务类代码用来和远程对象通讯。

这是最符合本人喜好的Flex程序的框架结构。它的优点是非常的清晰,没有累赘的发送和监听事件的工作,并且代码非常容易维护。遗憾的是,在此还没有获得足够的理论支持这一框架理论。

再来看看MVC框架的代表:MVC-Cairngorm

 

 

分享到:
评论
8 楼 huangxin5257 2010-02-11  
tj19832 写道
单例的GlobalObjectManager用于在UI之间传递数据,我觉得有点欠妥。
尤其当对象之间的关系非常复杂的时候。

Flex中不恰当的使用单例,可能是为了解决内存问题。
7 楼 bojay 2009-08-25  
       
引用
[flash=200,200][/flash]
[img][/img]
引用
[u][/u][i][/i][b][/b][/color][color=red][size=x-small][/size][align=center][/align]o ps:    
6 楼 jiorry 2009-02-14  
flex开发大型框架的难点在于解决 内存释放的问题。
5 楼 liuwenquan 2008-12-05  
找到原因,在RemoteObject中没有设置endpoint属性
4 楼 liuwenquan 2008-12-04  
houwei兄,这段代码不能login.
什么原因?没有其他兄弟测试过?
token = op.send.apply(null,args);
执行后,发现token的信息中destination=""
3 楼 yangjiehuan 2008-11-04  
谢谢分享。同时也谢谢Jeff Tapper。一直苦恼于框架的问题。当你的一个页面中有超过1000行代码的时候就不得不思考原因了。。。之前尝试小框架puremvc,虽说只是小框架,但和实际开发格格不入。下个case就用这个框架了。
2 楼 houwei 2008-08-06  
如果是webapp, 不会是问题, 因为flex在server端是httpsession base 的。
1 楼 tj19832 2008-08-05  
单例的GlobalObjectManager用于在UI之间传递数据,我觉得有点欠妥。
尤其当对象之间的关系非常复杂的时候。

相关推荐

    java随记等

    - 描述:用户管理 (`system_UserManagerment`) - 是否启用:`true` - 表示具有用户管理的权限。 21. **`USER_USERCOLLOCATE`**: - 数值:50101 - 层级:501 - 描述:用户分配 (`user_UserCollocate`) - ...

    Windows 7下如何安装SQL Server 2005.doc

    #### 二、安装标准版 SQL Server 2005 接下来是安装 SQL Server 2005 的过程。此版本为标准版,适用于大多数业务场景。 **步骤如下:** 1. **准备安装介质:** - 获取 SQL Server 2005 的安装光盘或 ISO 文件。 ...

    7-Zip MANAGERMENT

    7-Zip MANAGERMENT 7-Zip 9.20 7-Zip is a file archiver for Windows 95/98/ME/NT/2000/2003/2008/XP/Vista/7.

    Linux上搭建Java_Web服务器

    - **JDK (Java Development Kit)**: Java开发工具包,包含了Java运行时环境及Java工具。 - **MySQL**: 关系型数据库管理系统,用于存储和管理数据。 #### 二、JDK安装与配置 **步骤1:上传JDK文件** - 文件格式:`...

    courses-managerment-system--react

    入门首先,运行开发服务器: npm run dev# oryarn dev 用浏览器打开以查看结果。 您可以通过修改pages/index.js来开始编辑页面。 页面在您编辑文件时自动更新。学到更多要了解有关Next.js的更多信息,请查看以下资源...

    Cr-Storage Managerment and Cluster

    如上图所示 Linux 也包括 RedHat Enterprise Linux 在内,其存储模式由 5 个部分组 ,自底向上的顺序是:物理卷、内核块设备驱动、内核文件系统驱动、虚拟文件系统和应 程序数据结构组成。系统中所有的文件均被按此...

    book-managerment-code.zip_教育系统应用_C#_

    《图书管理系统基础代码详解》 图书管理系统是一种常见的信息管理软件,尤其在教育系统中有着广泛的应用。本系统基于C#编程语言,采用Windows Forms(Winform)风格进行开发,适用于VS2008集成开发环境。尽管其界面...

    color managerment英文原版

    色彩管理是IT行业中一个至关重要的领域,特别是在图形设计、摄影、印刷和数字媒体等行业。"Color Management" 这本书提供了一个全面的英文视角来探讨这一主题。以下是对这本书可能涵盖内容的详细概述: 1. **色彩...

    password_managerment.rar

    "password_managerment.rar" 是一个利用Hibernate和Spring框架开发的B/S模式(Browser/Server,浏览器/服务器)的密码管理系统。这个系统旨在帮助用户安全地存储和管理他们的账户信息,提高在线安全。 **1. ...

    f-admin:f-admin是一套基于Laravel框架开发的基础权限后台系统

    f-admin基础权限后台是一套基于Laravel框架开发的系统,不需要开发者重复重复的工作,就可以实现后台功能的快速开发,其主要特点包括:集成作曲家,安装使用方便。用户管理可以配置自己的权限。角色管理可以配置...

    Exon_Managerment:PhầnHệTrungTâm

    在压缩包文件"Exon_Managerment-master"中,我们可能会找到项目的源代码文件、配置文件、文档以及可能的测试数据。源代码文件通常包含C#类和方法,用于实现上述提到的功能。通过阅读源码,我们可以深入了解系统的...

    易问卷网络问卷调查系统 v1.0 PHP版.rar

    可设置问卷开始以及结束日期 智能表单验证 问卷明细数据列表查看 柱状图分析 采用AJAX,更强的用户体验 支持问卷截断、跳转 兼容Firefox,IE6.0,IeE7.0等主流浏览器 …… 后台登入地址:Managerment/AdminLogin.asp ...

    url_managerment

    在IT行业中,URL管理是构建网络应用程序不可或缺的一部分。在这个场景中,我们关注的是"URL_managerment",这可能是一个关于如何处理和响应URL的系统或工具。描述中提到的"HTML+XML+VC"暗示了我们将探讨这些技术如何...

    Ajax-hotel_managerment_final.zip

    Ajax-hotel_managerment_final.zip,操作,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页的情况下更改。

    用户管理模块,MFC适用, User Managerment

    1. 有完善的用户登录界面,用户管理界面及用户权限检查界面; 2. 本模块是我从项目上直接打包的,因此有个别无关紧要的地方没有修改,需要作一些修改方能正确编译通过, 但绝对可用, 【请有能力修改的再下载】。 3....

    fizz-gateway-community:Fizz网关是基于Java的微服务网关,可以实现热服务聚合,授权选择,服务脚本编码,在线测试,高性能路由,API审核管理和其他目的。 Fizz是基于Java异步框架WebFlux微服务网关,能够实现热服务编排,授权选择,脚本编码,在线测试,高性能路由,API审核等目的,强大的插件系统扩展,图形界面帮助企业API服务治理,减少中间Java中的Managerment API网关层胶水代码,降低编码占用,提高API服务稳定性安全性。

    Fizz Gateway是一个基于Java开发的微服务网关,能够实现热服务编排,自动授权选择,在线服务脚本编码,在线测试,高性能路由,API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并提供友好的图形化配置...

    项目管理方案(project managerment)

    项目管理是组织、规划和执行一个独特任务的过程,旨在达到特定目标,这通常涉及一系列临时性的活动,有明确的开始和结束日期。项目管理的基础概念包括项目定义、项目管理的本质以及项目生命周期。项目区别于日常运营...

    易问卷网络问卷调查系统 v1.0.zip

    易问卷(原东旭网络问卷调查系统)是一套方便你将调查问卷、民意调查、投票海选转移到...同时由于时间的关系,很多用户提出的实用功能未能在此版本中实现,请大家见谅,我们一定加紧开发。 legal 22:20 2010-01-10

    jsp程序

    【标题】"jsp程序"揭示了我们正在讨论的是基于JavaServer ...在实际开发中,还需要考虑其他因素,如数据库设计、安全性措施(如防止SQL注入和XSS攻击)、性能优化以及响应式设计等,以确保系统的稳定性和可扩展性。

    VDA汽车网络安全管理体系指南 Automotive Cybersecurity Management System Aduit

    为了有效执行VDA推荐的安全措施,企业可能需要遵循一系列步骤,包括识别潜在的安全风险、评估并管理这些风险、开发应对策略和方案、以及持续监控安全性能。这不仅涉及技术措施,还包括员工培训和意识提升、合作伙伴...

Global site tag (gtag.js) - Google Analytics