• 一种应用程序命令执行架构设计


    一种应用程序命令执行架构设计

    袁永福 2011-7-5

    有感于一些程序中ASPX页面中直接编写功能性代码,难于组织和维护,实现不了程序的高度可配置化,自此提出一种应用程序命令执行架构,其架构图如下

     

    在这个架构中,每一个应用程序中存在一个Host(宿主),它是应用程序功能模块组织中的顶级结构,它战略上管理着整个应用系统的功能点,而且是访问本架构的入口点。

    Host下面有若干个Module(功能模块),Module对象Name属性用于进行标识,有StartStop方法用于启动和停止功能模块。[袁永福版权所有]

    每一个功能模块下有若干个Command(命令),而一个个Command对象就实现了具体的功能点,Command对象有Name属性用于进行标识,对于WinForm程序,还提供快捷键、按钮图标、提示文本等属性。在具体的写代码中,可以Module类中定义一个个功能模块方法,然后通过反射生成一个个委托,并封装成Command对象;也可以从Command公共基础类型定义一个个实现具体功能的功能点类型。[袁永福版权所有]

    这样整个应用程序通过“Host — Module — Command”三级结构将所有的功能点组织在一起。Module可以动态的挂在Host下面而无需硬编码,这样可以实现插件式的软件功能机制,若精心设计还能搞出软件模块热拔插的机制。

    Host下面还有Session(会话),Session是一个运行时的数据容器,Command中的功能模块可以通过它来临时存储和共享数据,当Host关闭时Session中的数据会被清空。使用Session能减少各个Command的耦合性,保证系统的变形金刚的功能。在实现时,对于ASP.NET程序,这里的Session可以是ASP.NET Session的封装;对于WinForm程序,Session可以是一个字典列表对象。

    Host下面挂着Config(配置),[袁永福版权所有]Config是一个数据容器,其功能和Session类似,但其中的数据会被自动的持久化的。当Host关闭时,Config中的数据会自动保持到系统配置文件或者数据库中,当Host启动时系统又会从配置文件或数据库中加载上次保存的Config数据。各个ModuleCommand都可以使用各自的系统配置数据,这也能减少功能模块之间的耦合性。

    Host下面还挂着UI Controler(用户界面控制器),UI Controler用于访问用户界面,它下面挂着若干个Form(用户界面表单对象),对于WinForm程序是一个个窗体或用户控件,对于ASP.NET这是一个个ASPX页面或用户控件。

    每一个Form下面有着若干个功能性控件,比如菜单、按钮等等。这些功能性控件通过一种Binding机制绑定到Host下面挂着得所有的Command对象。当程序运行时,用户按下命令按钮,则通过绑定机制触发Command对象,从而执行Command对象的功能性代码来完成某项功能。

    由于采用Binding机制,这样在开发时不是直接处理菜单、按钮的点击事件,而是设置菜单、按钮的Binding相关属性。这种机制使得开发和维护用户界面变得很灵活。程序员只要把一个个Command对象实现好,而用户界面可以任意设计,后台代码基本上不需要修改。[袁永福版权所有]

    而且Binding机制能实现反向控制操作,当执行了某个操作使得一些Command的状态发生改变,比如可用状态、可见状态等等。此时系统会自动更新用户界面中的控件状态,比如设置菜单、按钮灰化使其不可用等等。

    为了能让Binding机制可行,需要提供很强的设计时支持,使得开发人员在开发应用程序用户界面时能很方便的将菜单、按钮和Command对象进行绑定,在这方面VS.NET没有任何问题。

    另外Command对象可以通过UI Controler来访问用户界面,这能避免功能性代码直接访问用户界面,降低后台功能性代码和用户界面的耦合度[袁永福版权所有]。

    Host下面还挂着Permission(授权),这是进行授权控制,在程序运行时用户按下菜单、按钮通过Binding机制触发Command对象,在最后的关头系统会自动调用Permission来进行Validate(验证)。若验证通过则触发Command对象,若验证不通过则啥都不会发生。而且根据授权信息还能更新用户界面的功能控件状态,比如某个Command通过不授权,用户没有权限调用,则自动设置绑定到该Command的菜单、按钮灰化,使其不可用。

    当然用户界面控件可以映射到Command对象,开发者编写的后台代码(User Code)也可以触发Command对象,此时也会通过授权验证。

    在实现中,Binding机制或者User Code都不能直接访问Command对象,而且使用命令名通过Host来查找Command对象并在Host内部的代码中触发,在Host内部触发Command对象前就可以调用Permission对象执行验证。

     

    通过这种应用程序命令执行架构,系统的功能和用户界面从逻辑上分开了,实现了插件式的软件功能架构,这种架构能促使开发者开发出能在多个项目中都能使用的程序功能模块,这些功能模块经过标准化就是产品,因此这种架构能为项目的产品化打下一个良好的技术基础。

    而且对于已有系统,可以将页面对象改造成Module,实现FormModule在形式上的统一而逻辑上的分开,这样能低成本的改造旧系统,保护客户的已有投资。

     

    以上是我提出的一种应用程序命令执行架构,欢迎拍砖。[袁永福版权所有]

  • 相关阅读:
    Spring入门学习(一)
    Debian环境下vi设置
    Debian 环境下安装Tomcat记录
    Debian安装记录
    [原]Fedora 20的yum配置
    vue中slot以及mate的用法
    Express+Nodejs 下的登录拦截实现
    Node.js 常用Mongoose方法
    Node.js常用express方法
    node、Mongo项目如何前后端分离提供接口给前端
  • 原文地址:https://www.cnblogs.com/xdesigner/p/2098475.html
Copyright © 2020-2023  润新知