UIP(User Interface Process Application Block )是微软社区开发的众多Application Block中的其中之一,它是开源的。UIP是一个MVC框架,区别与其它的一些MVC框架是它不仅支持webForm(网页),同样也支持winForm,但如果要从严格的M-V-C三者关系上去看,UIP看来也不能称之MVC模式的实现,UIP最多有V-C的关系,没有考虑进Model。UIP单纯从名字上看它只管表示层的流转,应该是微软在Code-behind上对MVC的一个修补,加上Asp.Net的事件驱动开发和WebControl所见及所得的开发模式,如果把Model也考虑在内,那这些特性将受到很大的影响(以后再讲这些影响,这里先略过)。所以简单的说,UIP由MVC中的V-C两部分构成,主要功能就是实现可配置的页面(表单)导航。
根据上面的分析来对UIP做一下分解,其构成主要有:
View――这个就不多做解释了,页面的CS类如果要实现其导航功能,就继承此类;
Controller――这个应该很好理解;
Navigator――是实际导航器的功能,从Controller得到下个View的名字,据此来导航到哪个View,但是它并没有直接就Redirect到相关的页面上去了,而是由ViewManager来Redirect的;
ViewManager――管理View的,主要得到当前View的一些信息,比如State,激活View(即Redirect到页面);
Configuration――负责读取配置用;
State――是一个状态,是对当前的任务一个保存状态,UIP提供了4种状态维护的持久化方法:
MemoryStatePersistence:内存状态维护
SessionStatePersistence:Session保存状态(一般采用这个)
SqlServerPersistState:保存到数据库,这个可以用分布式部署上去,可实现单点登录
IsolatedStoragePersistence:保存到文件
状态还可以有保存状态的时间期限。
UIP中还有一个Task的概念,据我的理解是一组View形成的一个页面调用序列集合,等一下讲到UIP的Config的时候再讲。
那么就可以开始采用UIP的导航功能了,下面简单得以登录来做看一下UIP的配置,假设有login.aspx,index.aspx,error.aspx其cs类都从View继承(当然您可以写一个ViewBase类,单一从此继承),有了一个myController的从Controller继承的类,那么可以根据下面一组配置来实现一个登录成功到index页面,失败到error(一般要停在登录页面提示重新登录,这里仅做例子)。
先在Web.Config中加入加入配置节
<configSections>
<!--UIPB Configiration-->
<section name="uipConfiguration" type="Microsoft.ApplicationBlocks.UIProcess.UIPConfigHandler,Microsoft.ApplicationBlocks.UIProcess " />
</configSections>
然后加入uipConfiguration的具体配置
<uipConfiguration enableStateCache="true" allowBackButton="true">
<objectTypes>
//ViewManager
<iViewManager
name="WebFormViewManager"
type="Microsoft.ApplicationBlocks.UIProcess.WebFormViewManager, Microsoft.ApplicationBlocks.UIProcess "/>
<state
name="State"
type="Microsoft.ApplicationBlocks.UIProcess.State, Microsoft.ApplicationBlocks.UIProcess "/>
//controller
<controller
name=" myController "
type="myController,myWebUI " />
<!—controller 这里还可以加入Controller/-->
//这里采用Session来持久化状态
<statePersistenceProvider
name="SessionStatePersistence"
type="Microsoft.ApplicationBlocks.UIProcess.SessionStatePersistence, Microsoft.ApplicationBlocks.UIProcess />
</objectTypes>
//下面定义view
<views>
<view name="logon" type="logon.aspx" controller=" myController " />
<view name="index " type="index.aspx" controller=" myController " />
<view name="error" type="error.aspx" controller=" myController " />
</views>
//**导航图,这里就是对应的一个Task
<navigationGraph
iViewManager="WebFormViewManager"
name="LoginTask "
state="State"
statePersist="SessionStatePersistence"
startView="login"//开始view
cacheExpirationMode="Absolute"//状态保存方式,分为相对还绝对时间 cacheExpirationInterval="12:00:00">//这里保存状态的时间间隔
>
<node view='login'>
<navigateTo navigateValue="success" view='index' />
<navigateTo navigateValue="fail" view='error' />
</node>
<!—node 这里可以添加更多的Node-->
</navigationGraph>
<!--navigationGraph 这里可以添加更多的-->
</uipConfiguration>
UIP的启动没有总控,而是采用人工的方法,手工启动的方法是在一个没有从View继承的Apsx中启动,注意,一定要没有从View类继承,否则会在启动类中实例化页面时找不到Task而出错,因此,在启动类的Page_Load方法中实例化一个Task,然后用UIPManager的启动类的StartNavigationTask方法来启动。【UIPManager.StartNavigationTask("LoginTask",task);//task为Task的实例】
正是因为UIP没有总控,这在实现上就不会和页面Page类从IHttpHandler继承的而造成冲突(这种冲突等以后再讲),就完全保留其事件驱动的特性,UIP的解决方案中这个是它的优点。但是,缺点也是很显然的没有考虑Model,就不能实现页面表单和Model的相互赋值,页面总控验证等功能。
总结UIP它只是单纯一个实现页面导航的可配置性的框架,但是是以开发的复杂度为代价的。
根据上面的分析来对UIP做一下分解,其构成主要有:
View――这个就不多做解释了,页面的CS类如果要实现其导航功能,就继承此类;
Controller――这个应该很好理解;
Navigator――是实际导航器的功能,从Controller得到下个View的名字,据此来导航到哪个View,但是它并没有直接就Redirect到相关的页面上去了,而是由ViewManager来Redirect的;
ViewManager――管理View的,主要得到当前View的一些信息,比如State,激活View(即Redirect到页面);
Configuration――负责读取配置用;
State――是一个状态,是对当前的任务一个保存状态,UIP提供了4种状态维护的持久化方法:
MemoryStatePersistence:内存状态维护
SessionStatePersistence:Session保存状态(一般采用这个)
SqlServerPersistState:保存到数据库,这个可以用分布式部署上去,可实现单点登录
IsolatedStoragePersistence:保存到文件
状态还可以有保存状态的时间期限。
UIP中还有一个Task的概念,据我的理解是一组View形成的一个页面调用序列集合,等一下讲到UIP的Config的时候再讲。
那么就可以开始采用UIP的导航功能了,下面简单得以登录来做看一下UIP的配置,假设有login.aspx,index.aspx,error.aspx其cs类都从View继承(当然您可以写一个ViewBase类,单一从此继承),有了一个myController的从Controller继承的类,那么可以根据下面一组配置来实现一个登录成功到index页面,失败到error(一般要停在登录页面提示重新登录,这里仅做例子)。
先在Web.Config中加入加入配置节
<configSections>
<!--UIPB Configiration-->
<section name="uipConfiguration" type="Microsoft.ApplicationBlocks.UIProcess.UIPConfigHandler,Microsoft.ApplicationBlocks.UIProcess " />
</configSections>
然后加入uipConfiguration的具体配置
<uipConfiguration enableStateCache="true" allowBackButton="true">
<objectTypes>
//ViewManager
<iViewManager
name="WebFormViewManager"
type="Microsoft.ApplicationBlocks.UIProcess.WebFormViewManager, Microsoft.ApplicationBlocks.UIProcess "/>
<state
name="State"
type="Microsoft.ApplicationBlocks.UIProcess.State, Microsoft.ApplicationBlocks.UIProcess "/>
//controller
<controller
name=" myController "
type="myController,myWebUI " />
<!—controller 这里还可以加入Controller/-->
//这里采用Session来持久化状态
<statePersistenceProvider
name="SessionStatePersistence"
type="Microsoft.ApplicationBlocks.UIProcess.SessionStatePersistence, Microsoft.ApplicationBlocks.UIProcess />
</objectTypes>
//下面定义view
<views>
<view name="logon" type="logon.aspx" controller=" myController " />
<view name="index " type="index.aspx" controller=" myController " />
<view name="error" type="error.aspx" controller=" myController " />
</views>
//**导航图,这里就是对应的一个Task
<navigationGraph
iViewManager="WebFormViewManager"
name="LoginTask "
state="State"
statePersist="SessionStatePersistence"
startView="login"//开始view
cacheExpirationMode="Absolute"//状态保存方式,分为相对还绝对时间 cacheExpirationInterval="12:00:00">//这里保存状态的时间间隔
>
<node view='login'>
<navigateTo navigateValue="success" view='index' />
<navigateTo navigateValue="fail" view='error' />
</node>
<!—node 这里可以添加更多的Node-->
</navigationGraph>
<!--navigationGraph 这里可以添加更多的-->
</uipConfiguration>
UIP的启动没有总控,而是采用人工的方法,手工启动的方法是在一个没有从View继承的Apsx中启动,注意,一定要没有从View类继承,否则会在启动类中实例化页面时找不到Task而出错,因此,在启动类的Page_Load方法中实例化一个Task,然后用UIPManager的启动类的StartNavigationTask方法来启动。【UIPManager.StartNavigationTask("LoginTask",task);//task为Task的实例】
正是因为UIP没有总控,这在实现上就不会和页面Page类从IHttpHandler继承的而造成冲突(这种冲突等以后再讲),就完全保留其事件驱动的特性,UIP的解决方案中这个是它的优点。但是,缺点也是很显然的没有考虑Model,就不能实现页面表单和Model的相互赋值,页面总控验证等功能。
总结UIP它只是单纯一个实现页面导航的可配置性的框架,但是是以开发的复杂度为代价的。