`

User Interface Process(UIP) Application Block 2.0 研究总结

 
阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>

By Ben


User Interface Process (UIP) Application Block - Version 2.0<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

环境: WinXP, SQL Server 2000 + SP<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chmetcnv style="BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x" tabindex="0" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="3" unitname="a" w:st="on">3A</chmetcnv>, .Net 1.1, UIP 2.0

研究思路:

1. 了解熟悉UIP和它的架构

2. 安装UIP

3. 研究demo, 了解UIP实际意义

4. 完成UIP应用的helloworld程序

5. 进而考虑总结实际项目中对UIP的可利用之处

概述

UIPApplication Block 之一, 但它也使用到Data Access Application Block.

UIP设计出来的目的是实现我们以往设计UI的一些固定化的UI逻辑管理起来, 并加以控制.

根据MVC模式实现更复杂的UI逻辑. 也就是将UI Layer的一些logic抽出来放在Business

UIP的架构:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" path=" m@4@5 l@4@11@9@11@9@5 xe" stroked="f" filled="f" o:spt="75" o:preferrelative="t" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0 "></f><f eqn="sum @0 1 0 "></f><f eqn="sum 0 0 @1 "></f><f eqn="prod @2 1 2 "></f><f eqn="prod @3 21600 pixelWidth "></f><f eqn="prod @3 21600 pixelHeight "></f><f eqn="sum @0 0 1 "></f><f eqn="prod @6 1 2 "></f><f eqn="prod @7 21600 pixelWidth "></f><f eqn="sum @8 21600 0 "></f><f eqn="prod @7 21600 pixelHeight "></f><f eqn="sum @10 21600 0 "></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype>

UIP架构图

一些相关名词解释:

View

与系统用户最接近的一层, 也是UI可见的一部分. UIP提供

WebFormView,

WindowsFormView,

WindowsFormControlView来自定义我们的程序的 View. 相当于MVC View

UIP Configuration

一般是workflow等界面的或UIP的设置

Controller

觉得是UIP的中心, 主宰UI逻辑的控制器

相当于MVCController

State

顾名思义, 是管理状态的, 相当于MVCModel

相关名词: Task

1. 安装

Block安装程序、demo的源码都是公开的, 可以在微软网站上download

download 安装包除这个application 的数据库和全部源码外, 还有几个demo 源码

2. demo分析

本次研究只重点研究StoreWeb Application 实例.

这个Store工作流程

Store工作流
View
的设置定义

而以上相关页面的View Configuration定义于Web.Config:

views>

view name="cart" type="cart.aspx" controller="StoreControllerNavGraph" />

view name="browsecatalog" type="browsecatalog.aspx" controller="StoreControllerNavGraph" />

view name="error" type="uipError.aspx" controller="StoreControllerNavGraph" />

view name="congratulations" type="congratulations.aspx" controller="StoreControllerNavGraph" />

view name="checkout" type="checkout.aspx" controller="StoreControllerNavGraph" />

view name="survey" type="survey.aspx" controller="SurveyController" />

views>

type: asp.net页面. 由此看到UIP的一个局限地方: 页面不能是带参数的地址. 比如我们一般实现的新增记录就编辑记录是同一个页面. 用一个类同action=Edit/Add的参数来区别页面是实现编辑还是新增. 在这里只有分开两个页面来实现了.

而以上的viewasp.netbase on UIP WebFormView. 至于UIPWebFormView实现了什么? 实现IView和配置当前viewController (将这里只粗略介绍, 没详细研究)

目的是为以下程序使用Controller实现界面逻辑作个前提.

值得一提的是利用UIP实现工作流, 工作流的设置也在Web.Config

navigationGraph

iViewManager="WebFormViewManager"

name="Shopping"

state="State"

statePersist="SqlServerPersistState"

startView="browsecatalog"

cacheExpirationMode="Absolute"

cacheExpirationInterval="12:00:00">

node view='cart'>

navigateTo navigateValue="resume" view='browsecatalog' />

navigateTo navigateValue="checkout" view='checkout' />

navigateTo navigateValue="fail" view='error' />

navigateTo navigateValue="stop" view='logon'/>

node>

node view='browsecatalog'>

navigateTo navigateValue="addItem" view="cart"/>

navigateTo navigateValue="fail" view='error' />

node>

node view='error'>

navigateTo navigateValue="resume" view='cart' />

node>

node view="checkout">

navigateTo navigateValue="congratulations" view="congratulations" />

navigateTo navigateValue="failCheckout" view="checkout" />

node>

node view='congratulations'>

navigateTo navigateValue="resume" view='cart' />

navigateTo navigateValue="stop" view='cart' />

node>

navigationGraph>

结合View的定义设置, 这个navigationGraph> 就好理解多了, 它目的是定义流程的各个关键点.

当界面调用

UIPManager.StartNavigationTask ( "Shopping", task );

//解释 Shopping : navigationGraph 的标识名字name

//task是什么? task就是主要是得到CurrentTask(以下会提到的), 即当前的用户界面的State

controller: 引用哪个UIP Controller, Web.Config也设置这个Controller的位置:

uipConfiguration enableStateCache="true" allowBackButton="true">

objectTypes>

iViewManager

name="WebFormViewManager"

type="Microsoft.ApplicationBlocks.UIProcess.WebFormViewManager, Microsoft.ApplicationBlocks.UIProcess,

Version=<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.0.1</chsdate>.0,

Culture=neutral,

PublicKeyToken=null"/>

……

controller

name="StoreControllerNavGraph"

type="UIProcessQuickstarts_Store.StoreControllerNavGraph, UIProcessQuickstarts_Store.Common, Version=<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.0.1</chsdate>.0,

Culture=neutral,

PublicKeyToken=null" />

controller

name="SurveyController"

type="UIProcessQuickstarts_Store.SurveyController,

UIProcessQuickstarts_Store.Common, Version=<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.0.1</chsdate>.0,

Culture=neutral,

PublicKeyToken=null" />

statePersistenceProvider

name="SqlServerPersistState"

type="Microsoft.ApplicationBlocks.UIProcess.SqlServerPersistState,

Microsoft.ApplicationBlocks.UIProcess,

Version=<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.0.1</chsdate>.0,

Culture=neutral,

PublicKeyToken=null"

connectionString="server=.;database=UIPState;user id=UIP;password=U1Pr<chmetcnv style="BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x" tabindex="0" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="C" w:st="on">0c</chmetcnv>3ss"/>

objectTypes>

UIP可以猜想到, 这些Controller是我们base on UIPControllerBase, 是界面逻辑主要集中地方. 可以简单的理解为使用UIPNavigator, 根据ViewConfiguration来实现界面跳转, 见代码:

State.NavigateValue = "StoreForm";

Navigate();

//解释 StoreForm : navigationGraph 定义的navigateValue导航指向View的标识

// Navigate(); 就实现redirect.

State(Model): 主要负责用户界面状态的管理. 使用到Data Access Application Block来读取保存在数据库是用户界面状态.

statePersistenceProvider

name="SqlServerPersistState"

type="Microsoft.ApplicationBlocks.UIProcess.SqlServerPersistState,

Microsoft.ApplicationBlocks.UIProcess,

Version=<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.0.1</chsdate>.0,

Culture=neutral,

PublicKeyToken=null"

connectionString="server=.;database=UIPState;user id=UIP;password=U1Pr<chmetcnv style="BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x" tabindex="0" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="C" w:st="on">0c</chmetcnv>3ss"/>

这里将界面状态数据库与系统应用数据库分开.

这个用户界面当前状态保存在Session(如下表格), 同时会更新到以上设置的状态数据库里. 所以这里使用UIP要注意的是Session的使用问题了.

会话状态

会话键

类型

TaskMoniker43d<chmetcnv style="BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x" tabindex="0" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="7" unitname="C" w:st="on">7c</chmetcnv>64e-8be1-4b0d-bc79<chmetcnv style="BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x" tabindex="0" tcsc="0" numbertype="1" negative="True" hasspace="False" sourcevalue="442" unitname="a" w:st="on">-442a</chmetcnv>790173de

System.String

NewsManagement:list:43d<chmetcnv style="BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x" tabindex="0" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="7" unitname="C" w:st="on">7c</chmetcnv>64e-8be1-4b0d-bc79<chmetcnv style="BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x" tabindex="0" tcsc="0" numbertype="1" negative="True" hasspace="False" sourcevalue="442" unitname="a" w:st="on">-442a</chmetcnv>790173de

CurrentTask

System.String

43d<chmetcnv style="BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x" tabindex="0" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="7" unitname="C" w:st="on">7c</chmetcnv>64e-8be1-4b0d-bc79<chmetcnv style="BACKGROUND-POSITION: left bottom; BACKGROUND-IMAGE: url(res://ietag.dll/#34/#1001); BACKGROUND-REPEAT: repeat-x" tabindex="0" tcsc="0" numbertype="1" negative="True" hasspace="False" sourcevalue="442" unitname="a" w:st="on">-442a</chmetcnv>790173de

由以上:

UIP是将界面根据MVC的特点
MVC

基于asp.net的设计思想上搭建起来, 让程序员的工作主要集中在Controller设计上

开发应用配置

以下是针对我们一般使用vs.net开发做法来配置项目的UIP的过程步骤

1. 建立数据结构 (, 请参考UIP安装后的demo数据库)

2. 建立Web Application Project 主要引用如下

a) Microsoft.ApplicationBlocks.UIProcess

b) Common Layer Project

3. 建立Common Layer Project 主要引用: Microsoft.ApplicationBlocks.UIProcess

4. 添加UIP Project. UIP安装后提供的源码的两个Project加到Solution: Microsoft.ApplicationBlocks.Data, Microsoft.ApplicationBlocks.UIProcess

5. 设置UIP Configuration, Web ApplicationWeb.Config

a) 设置configSections.

b) 设置 uipConfiguration.

i. objectTypes.statePersistenceProvider要设置用户界面状态的数据库保存位置

ii. objectTypes.controller是我们要自定义的Controller

iii. views 是设置要管理的页面, 和页面的Controller

iv. navigationGraph 主要对界面流程进行设置

c) 设置 session , 确保 enable session

6. 根据第3点提到的, Common Layer Project添加一个类, 作为Controller定义. 这个Controller定义主要注意:

a) (包括Constructor)base on Microsoft.ApplicationBlocks.UIProcess.ControllerBase

b) 方法: 根据需求, 获得State的记录ID

c) 自定义一些Navigation 的逻辑

7. Common Layer Project定义Task, 模板请参考demo, 方法名是必须与demo的一样, 因为UIPUIPManager会使用这些方法

8. 建立项目需要的其他Project(Business, DataAccess的等)

这便完成了引用UIP的配置

总结:

其实经过研究

1. 觉得UIP是看需要而用的了. 而且要实现类同OA那种多态复杂的工作流, 使用UIP会大大提高我们的开发效率和更利于维护工作

2. 和如果遇到类似: 系统页面状态如何管理与维护, 或对页面权限设置分配的, 也可以详细具体研究UIPState

而一般的系统应用就免了



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=201559


分享到:
评论

相关推荐

    User Interface Process (UIP) Application Block 2.0 版

    前段时间找到的 User Interface Process (UIP) Application Block 2.0 版

    uip_process流程

    UIP协议栈的 uip_process处理流程中文解释

    uIP:一种用在8位嵌入式系统中的轻量级的TCP/IP协议栈

    UIP(User Interface Process Application Block)是微软社区开发的众多Application Block中的其中之一,它是开源的。UIP是一个MVC框架,区别与其它的一些MVC框架是它不仅支持webForm(网页),同样也支持 winForm,但...

    uIP-1.0源码

    uIP-1.0源码 uIP is a very small implementation of the TCP/IP stack that is written by Adam Dunkels &lt;adam@sics.se&gt;. More information can be ...unix/ - uIP as a user space process under FreeBSD or Linux

    嵌入式系统/ARM技术中的LPC2364在串口转网口专用协议卡的研究

    串口转网口模块是一个可以让串口设备立即具备联网能力的设备联网... UIP(User Interface Process Application Block)是微软社区开发的众多ApplicationBlock中的其中之一,它是开源的。UIP是一个MVC框架,区别与其它

    UIP中文文档第六uIP原始线程(protothreads[总结].pdf

    UIP中文文档第六uIP原始线程(protothreads[总结].pdf

    uip0.9协议栈

    MCU51单片机uIP协议栈+ENC28J60网卡 移植、应用 目录 1 概述: 1 2 代码文件结构图: 2 2.1 文件列表: 2 2.2 代码流程图: 3 3 系统开销: 3 4 网卡硬件原理图: 5 5 SPI接口驱动: 6 6 ENC28J60驱动: 7 7 uIP协议...

    uip1.0协议栈

    uIP由瑞典计算机科学学院(网络嵌入式系统小组)的 Adam Dunkels开发。其源代码由 C 语言编写,并完全公开,uIP 协议栈去掉了完整的 TCP/IP 中不常用的功能,简化了通讯流程,但保留了网络通信必须使用的协议,设计...

    uip0.9 + uip1.0的资料与源码

    uip0.9 和uip1.0的uip文档 和 源代码; 对理解TCP/IP协议 和编写嵌入式设备上的网络模块有很大的帮助

    微软企业库2.0 案例

    它包含7个应用程序块(Application Block): 1、配置块(基本不用配置) 2、数据访问块(配置连接字符串、默认实例) 3、日志块(配置Sinks、Formatters、Category、默认策略) 4、异常块(添加异常类型,指定...

    51移植 uip1.0

    51移植 uip1.0

    uip的DM9000驱动

    uip的DM9000驱动,DM9000A uP NIC fast Ethernet driver for uIP

    UIP应用案列

    例程移植uIP-1.0协议栈,演示开发板和PC间的TCP通信。自定义了一个简单的应用层 通信协议。本例程实现的功能有:(1)通过PC机控制板子上的LED;(2)实现了一个简单的Web服务器。 (This routine transplant uIP-1.0...

    uip0.9+1.0

    uip 0 9 1 0源代码

    uIP协议栈C程序

    uIP协议栈

    Uip.文档web服务器

    uIP提供了网络通信所必须的协议, 本身代码和占用的内存数都非常少 - uIP的源代码只有几KB, RAM占用仅几百字节. uIP是一个完全由C语言编写的开源软件, 它的文档和源代码可用于商业和非商业用途, 它已经移植到了大...

    uip.rar_uIP0.9_uip_uip keil_uip-1.0_uip接口

    uIP移植 uIP的设备驱动程序接口 uIP的应用程序接口 uIP0.9 keil移植要点、 源码公开的TCP/IP协议栈uIP的应用 、 1 嵌入式TCP/IP协议栈 uIP的设备驱动程序接口 uIP的应用程序接口 uIP0.9在发电机远程监测系统中的应用

    uip-0.9源码

    uip-0.9源码

    uip的教学步骤

    关于Uip的移植教程,一步一步教你移植uIP0.9到8051+RTL8019AS

    uIP入门完全掌握

    在uIP_中文资料当中, 原作者翻译了一篇老外的文献,大家仔细看。 3.最后有需要可以参考 uip在单片机上的移植精讲。 Finish:完成以上步骤基本就算入门了。 **************************************************...

Global site tag (gtag.js) - Google Analytics