`
wuxian_Abs
  • 浏览: 5749 次
  • 性别: Icon_minigender_1
  • 来自: 兰州
社区版块
存档分类
最新评论

基于parsley的项目前台架构【转】

 
阅读更多

1.项目简介
    本人准备开发一个信息管理系统,经过详细的考虑,决定采用基于parsley的MVC框架作为FLEX开发的框架。
    parsley的MVC框架的优点
        .适当解耦(视图类和视图model类、控制类与service类),提高了程序的可读性和可维护性
        .避免使用FLEX的事件传播机制,降低了系统运行的风险(过多的注册监听事件会带来意想不到的问题,比如不及时删除无用的事件监听器,会阻止垃圾回收器从而造成内存泄露,而且它们还很难跟踪并且影响程序的性能)
        .适当的对象托管会给编程带来方便
    下图所示:


    parsley的MVC框架中,一个典型的模块的包分为六个部分:视图包、视图model包、Command包、Model包、Service包、消息包。
    类与类之间的数据传递通过框架提供的消息来完成。
    由于消息类大量的与Model类重复,比如创建用户消息类CreateUserMessage中只有一个类User.从整体上看提高了程序可读性,但是加大了编码工作量,本人决定舍弃消息层,将消息包与Model包合并成Model层,比如CreateUserCommand类的参数直接使用UserModel,而不是CreateUserMessage。
部分代码说明如下:
    <spicefactory:DynamicCommand type="{CreateUserCommand}" messageType="{CreateUserMessage}" />
取消了Message包后,
    <spicefactory:DynamicCommand type="{CreateUserCommand}" messageType="{UserModel}" />

2.项目目录结构
src
   --默认包
       --index.mxml   //首页面
       --Config.mxml  //根配置文件
   --com.teacherHome
       --system
          --config
              --SystemConfig.mxml  //系统管理模块配置文件
          --commands
              --CreateXsCommand.as    //创建学生命令
              --DeleteBjCommand.as    //删除班级命令
          --models
              --LoginModel.as         //登录数据类
              --XsModel.as            //学生数据类
              --BjModel.as            //班级数据类
          --Services
              --XsSevice.as           //学生远程服务类
              --BjService.as          //班级远程服务类
              --mock
                   --XsServiceMock.as //学生服务测试类
                   --BjServiceMock.as //班级服务测试类
          --view
              --components
                   --CjPanel.mxml     //成绩组件
              --renderers
                   --ImageRenderer.mxml //Render组件
              --skins
                   --CjListSkin.mxml  //成绩列表皮肤组件
              SystemMain.mxml         //系统管理主页面
          --styles
              --System.css            //系统管理的CSS文件

3.视图包与视图model包
    视图类负责组织页面的组件显示,只包含组件和组件事件处理函数。视图model类注入到视图中,负责管理业务逻辑。
例:
登录视图类代码片段:
    <mx:Script>
        <![CDATA[
            import com.adobe.system.view.LoginPM;
            
            [Bindable]
            [Inject]
            public var pm : LoginPM;//视图model类

            
            private function handleKeyDown( event : KeyboardEvent ) : void
            {
                if( event.keyCode == Keyboard.ENTER )
                {
                    pm.username=usernameInput.text;
                    pm.password=passwordInput.text;
                    
                    pm.login(username, password);
                }
            }

            protected function button1_clickHandler(event:MouseEvent):void
            {
                pm.login(username, password);  //业务逻辑也封装在视图model中
            }

        ]]>
    </mx:Script>
    
    <mx:Panel horizontalCenter="0"
              verticalCenter="0">
        <mx:Form
            keyDown="handleKeyDown( event )">
            <mx:FormItem label="name">
                <mx:TextInput 
                    id="usernameInput"
                    text="{ pm.username }"/>  //数据封装在视图model类中
            </mx:FormItem>
            <mx:FormItem label="password">
                <mx:TextInput 
                    id="passwordInput" 
                    text="{ pm.password }"
                    displayAsPassword="true"/>
            </mx:FormItem>
        </mx:Form>
        
        <mx:CheckBox
            label="Model injected?"
            labelPlacement="left"
            enabled="false"
            selected="{ pm != null }"/>
        
        <mx:Button 
            label="login"
             click="button1_clickHandler(event)"/>
    </mx:Panel>

视图model类
    public class LoginPM 
    {
        public var username : String="good";
        public var password : String="bad";
        public var isinit:Boolean=false;
        
        [init]
        public function LoginPM():void
        {
            isinit=true;
        }
        
        [MessageDispatcher]
        public var sendMessage:Function;

        
        public function setUsername( username : String ) : void
        {
            this.username = username;
        }
        
        public function setPassword( password : String ) : void
        {
            this.password = password;
        }
        
        public function login( username:String, password:String ):void {
            
            if( username != '' && password != '' ) {
                message = '';
                var loginMessage:LoginMessage = new LoginMessage( username, password );
                sendMessage( loginMessage );  //派发消息
            }
        }

        //接收登录处理结果,当Commandod类的方法result处理完成后,自动派发CommandResult命令
        [CommandResult(type="com.messages.LoginMessage")]
        public function handleResult() : void {
            if( session.loggedIn ) {
                mainPresentationModel.switchTo( Constants.STATE_DASHBOARD );
            }
            else {
                message = ResourceManager.getInstance().getString(
                    'General', 'loginFailed' );
            }
        }
        //当Commandod类的方法error处理完成后,自动派发CommandError命令
        [CommandError(type="com.messages.LoginMessage")]
        public function handleError():void {
            message = ResourceManager.getInstance().getString(
                'General', 'serviceFailed' );
        }

    }

4.Command包
    一个服务对应着一个Command类,比如CreateUserCommand,LoadUsersCommand。
例子代码:
public class LoginCommand {
        [Inject]
        public var loginService:IUserService;
        
        [Inject]
        public var session:Session;
        
        private static const logger:Logger = LogContext.getLogger( LoginCommand );
        
        public function execute( message:LoginMessage ):AsyncToken {
            return loginService.login( message.username, message.password );
        }
        
        public function result ( user:User ) : void {
            if( user != null ) {
                session.loggedIn = true;
                session.user = user;
            }
            else {
                session.loggedIn = false
            }
        }
        
        public function error (fault:Fault) : void {
            logger.error( "service call failed: " + fault.message );
        }
        
        
    }
在配置文件中必须设置动态命令标签:
    <spicefactory:DynamicCommand type="{LoginCommand}" />

5.Service包
    Service类负责与后台进行交互,从WEB服务器或数据库获取数据。
模拟后台调用代码如下:
    public class UserService implements IUserService {
        private var user:User;
        private var mockServiceUtil:MockServiceUtil = new MockServiceUtil;
        
        public function LoginServiceMock() {
            user = new User();
            user.id = "1";
            user.firstname = "Jochen";
            user.lastname = "Hilgers";
        }
        
        public function login(username:String, password:String):AsyncToken {
            return mockServiceUtil.createToken( user );
        }

6.Model包
    model类负责封装对象的属性,model类主要分为二种:一、实体对象,比如用户UserModel,班级BjModel等;二、传递的消息,比如登录事件中传递的LoginMessage。
例子:
    public class LoginMessage {
        public var username:String;
        public var password:String;
        
        public function LoginMessage( username:String, password:String ) {
            this.username = username;
            this.password = password;
        }
    }

    [RemoteClass(alias="com.model.User")]
    public class User {
        
        public var id:String;
        public var firstname:String;
        public var lastname:String;
    }

转自:http://blog.chinaunix.net/space.php?uid=122937&do=blog&id=143083

分享到:
评论

相关推荐

    parsley-2.3.1资源

    Parsley 2.3.1 是一个开源框架,主要用来处理复杂的软件架构和应用程序设计。这个资源包包含了所有开发者需要的组件,以便于理解和利用Parsley框架进行高效开发。 首先,让我们来深入了解"Parsley"。Parsley 是一个...

    parsley-flash api

    Parsley Flash API 是一个专为Adobe Flash平台设计的组件,用于增强Flash应用程序的功能...在实际项目中,结合提供的压缩包文件"Parsley-flash",开发者可以深入研究API的各个部分,以便更好地将其应用于自己的项目中。

    parsley例子parsley例子

    - `Parsley2Flash.zip`和`Parsley2Flex.zip`包含了基于Parsley框架的Flash和Flex示例项目。通过分析这些项目,你可以了解如何在实际开发中配置Parsley上下文,如何使用命令模式处理事件,以及如何利用依赖注入管理...

    parsley官方资料详解

    Parsley 是一个专门为 Flex 和 Flash 开发的 Inversion of Control (IOC) 容器和消息框架,旨在创建高度解耦的架构。它的核心功能包括依赖注入、对象生命周期管理和消息传递,且具备良好的扩展性。Parsley 不仅能在 ...

    parsley2.4英文开发手册

    - **Flex 平台集成**:由于 **Parsley** 的核心组件不依赖于 Flex SDK,因此可以轻松集成到现有的 Flex 项目中,为开发团队提供更多灵活性。 #### 五、总结 **Parsley 2.4 英文开发手册** 为开发者提供了强大的...

    parsley loc框架 flash flex 通用

    标题中的“Parsley LOC框架”指的是Parsley框架,这是一个专门为Adobe Flex和ActionScript开发者设计的开源依赖注入(Dependency Injection)和应用架构框架。它增强了Flex和Flash应用程序的可维护性和可扩展性,...

    Flex Cairngorm Parsley Demo 源码

    Parsley是Spring ActionScript项目的一部分,是一个更强大的依赖注入(DI)和面向切面编程(AOP)框架。它简化了组件间的通信,通过自动注入依赖关系,使得代码更加简洁和易于测试。Parsley还提供了拦截器、事件调度...

    Parsley.js-

    **Parsley.js** 是一个强大的前端验证框架,专门用于JavaScript,它的主要目的是在用户提交表单之前确保输入数据...无论是在简单的个人项目还是大型的企业级应用中,Parsley.js都能为表单验证带来便利,提升用户体验。

    ParsleyTest Flex框架parsley的使用入门

    Parsley是ActionScript 3.0的一个强大依赖注入(DI)和控制反转(IoC)框架,它为Flex和Adobe AIR应用程序提供了灵活的架构支持。这个名为"ParsleyTest"的压缩包文件包含了关于如何开始使用Parsley框架的源码示例,...

    parsley中文版 绝对真实

    - 项目管理:对于团队协作,Parsley可能有任务分配、进度追踪、团队沟通等功能,帮助项目经理有效管理项目。 - 设计工具:如果是图形设计类软件,Parsley可能提供各种绘图、编辑和效果处理工具,满足设计师的需求。 ...

    Python-Parsley处理HTML为JSON

    首先,Parsley库的核心是基于HTML5lib,这是一个符合HTML5标准的解析器。它能够处理不规范的HTML,提供了一种强大的方式来解析复杂的网页结构。Parsley通过解析HTML文档,创建一个DOM(Document Object Model)树,...

    parsley doc and src

    标题 "parsley doc and src" 暗示我们关注的是一个名为 "Parsley" 的项目,其中包含文档(doc)和源代码(src)。Parsley可能是一个软件框架、库或者工具,而"spicefactory-Spicelib-Documentation-4258051" 这个...

    parsley-flex api

    - 如果你已经有基于Parsley API 的项目,Parsley-Flex 提供平滑的迁移路径,帮助你充分利用其新增功能。 - 对于新项目,评估需求和Parsley-Flex 的契合度,考虑是否采用它作为基础架构。 总之,Parsley-Flex API ...

    parsley2 中文指南

    若你不知道parsley,但您一定听过Cairngorm、Mate、PureMVC、Swiz或SpringAcitonScript,只要听说过其中之一就好了,因为parsley也是他们行列中的一员,是Adobe项目组今年7月份推荐的一个灵活的flex框架!

    Parsley Framework 和 Tips for Flex 的 PPT

    Parsley通过提供灵活的架构,使开发者可以专注于业务逻辑,而非基础设施的细节。这个框架的核心特点是它的依赖注入系统,它允许组件声明其依赖,而无需直接创建依赖对象。这样可以降低代码耦合度,提高可测试性和可...

    Parsley.js示例

    Parsley 2.0 is available in early dev mode for testing purpose. You can see it there at the moment: Parsley2 doc Please have a try, and your feeback here would be much appreciated! Thanks

    开源项目-opsidian-parsley.zip

    4. **可扩展性**:由于其基于解析器组合子的特性,Opsidian Parsley很容易扩展以支持新的语言特性和功能。 三、使用Opsidian Parsley的步骤 1. **安装**:首先,你需要获取`opsidian-parsley`库,这通常可以通过...

    parsley.js验证

    5. **模块化设计**:Parsley.js采用模块化设计,可以根据项目需求选择性地加载组件。 **二、Parsley.js的使用步骤** 1. **引入资源**:在HTML文件中,需要引入`parsley.css`用于样式布局,`parsley-2.0.3.js`或其...

Global site tag (gtag.js) - Google Analytics