现在的位置: 首页 > 综合 > 正文

对WebForm实现Front Controller模式改进的构思

2012年01月17日 ⁄ 综合 ⁄ 共 1451字 ⁄ 字号 评论关闭

       当使用了MonoRail后发现自己更偏向于使用Front Controllers模式,虽然这模式下缺少了Asp.net服务控件和基于事件驱动的功能,但是功能职责划分更细致明确;于是在WebForm的基础上实现Front Controller模式;实现后发现Controller始终依赖于PageHttpContext对象才能进行功能处理,这样Controller除了职责不明确外还导致和Page偶合性太高。为了让Controller不关注Asp.Net相关特性,专注于逻辑的处理于是想出了以下改进方法。

1)  隔离PageController,Controller的处理信息依赖于接口,接口本身定义并不包含任何Asp.Net相关特别性描述。

2)  建立上下文容器进行接口实例的切入,让开发者不用关心接口信息的来源。

3)  接口成员信息自动绑定。

模式改进后的处理结构图:


当使用者请求页面时,框加会通过PageContext进行相关Controller方法定位操作,当查找到相关方法后自动绑定相关接口实例并传递给相关的方法。页面最终根据接口描述的信息进行输出。

下面通过代码了解Page-IView-Controller的处理关系。

首先定义视图描述接口:

/// <summary>

/// 描述订单查询的处理规则

/// </summary>

public interface IOrderView

{

 

    [Bind]

    string CustomerID

    {

        get;

        set;

    }

    [Bind]

    string EmployeeID

    {

        get;

        set;

    }

    System.Collections.Generic.IList<Orders> Items

    {

        get;

        set;

    }

}

 

相关的Controller行为:

public class Controller

{

    [FormMapper("~/FrmOrderView.aspx")]//主要用提供Context的方法定位

    public void OrderView(IOrderView orderview)

    {

        if (orderview.CustomerID != null)

        {

            //...

        }

        if (orderview.EmployeeID != null)

        {

            //...

        }

        //orderview.Items=find Data

    }

}

 

Controller处理完成后,页面就可以根据接口信息进行输出.

<% IOrderView view = (IOrderView)this.View;

foreach(Order item in view.Items)

{

%>

<tr>

    <td><%=item...... %></td>

    <td><%=item...... %></td>

    <td><%=item...... %></td>

</tr>

<%} %>

 

从以上代码可以看到Controller具备处理IOrderView的能力,IOrderView的实例不管是Asp.Net创建还是WinFrom下创建都不会影响Controller处理功能,这样Controller的灵活性就更高。

该模式现在还是在构想阶段,有意见或想法的朋友多提一下。

抱歉!评论已关闭.