龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

学习.NET架构设计系列:Model–View–Controller(MVC设计模式)(4)

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
BaseAction中有几个Init方法,这几个方法分别对不同的窗体控件进行绑定,目前支持的控件有按钮、菜单、工具条、树节点。如果需要的话,还可以添加支持

BaseAction中有几个Init方法,这几个方法分别对不同的窗体控件进行绑定,目前支持的控件有按钮、菜单、工具条、树节点。如果需要的话,还可以添加支持别的控件。控件和行为进行绑定时,需要参照行为的可用和可见情况,对控件的外观和行为进行设置。当控件被用户操作时,会触发响应函数,这些响应函数最后都会调用Execute方法。  

/// <summary> 
/// 执行行为 
/// </summary> 
public virtual void Execute() 

这样就为所有的窗体控件做到了统一的控制方式。比如我们可以把主窗体上的某个菜单项、工具栏按钮、树视图节点都绑定在同一个行为上,当这些控件发生动作的时候,都会触发这个行为的Execute方法。如果我们把这个行为设置为不可用,所有的相关控件同时都会成为灰色,不可点击。

在示例程序里,当主画面打开时,会建立三个Action,并且绑定相应的界面控件。请看MainWin的Form1_Load方法:  

        private void Form1_Load(object sender, System.EventArgs e)
        {
            
//退出应用程序
            BaseAction exitAction = ActionFactory.CreateAction(1000);
            exitAction.Init(menuItem7);

            
//打开用户缴费的界面
            BaseAction openPayMoneyAct = ActionFactory.CreateAction(1001);
            openPayMoneyAct.Init(toolBarButton1);
            openPayMoneyAct.Init(menuItem5);
            openPayMoneyAct.Init(
this.treeView1.Nodes[0].Nodes[0]);

            
//打开资费变更的界面
            BaseAction openChangePriceAct = ActionFactory.CreateAction(1002);
            openChangePriceAct.Init(toolBarButton2);
            openChangePriceAct.Init(menuItem6);
            openChangePriceAct.Init(treeView1.Nodes[
0].Nodes[1]);
            
//openChangePriceAct.IsVisible = false;
            
//openChangePriceAct.Enabled = false;
        }

在用户缴费和资费变更的界面上,也是用相似的方式实现了行为的控制。请看PayMoney和ChangePrice的构造函数,他们分别建立了自己需要的行为,并且和按钮进行绑定。

在Action的Execute方法中,收集视图上的输入,调用业务对象进行工作。然后再把工作的结果展现在视图上。下面是PayMoneyAction的Execute方法,他实现了缴费功能: 

public override void Execute()
{
    
//更新视图属性,把视图元素的值更新到属性里面
    BaseView view = MainWin.GetInstance().GetActiveView();
    view.UpdateAttributes();

    
//得到界面上的电话号码和缴费金额
    string phone_no = view.GetAttribute("phone_no").ToString();
    
string money_amount = view.GetAttribute("money_amount").ToString();

    
//调用业务对象进行缴费
    try
    {
        User user 
= User.GetUserByPhoneNo(phone_no);
        Account account 
= user.GetAccount();
        account.Pay(
float.Parse(money_amount));
    }
    
catch (Exception e)
    {
        MessageBox.Show(e.Message);
        
return;
    }
    
    
//向界面发出成功消息
    MessageBox.Show("缴费成功 :)");

    
//把界面清空
    view.SetAttribute("phone_no""");
    

    
//根据视图的属性,更新视图界面
    view.UpdateView();
}

现在我们实现了一个前端控制器的最简单的示例。令人不满意的是,其中有很多硬编码:在主窗体上的控件都是手工拖放上去的,行为也要手工定义,然后与控件进行绑定;并且在ActionFactory和ViewFactory中,行为和视图的建立也是用硬编码实现的。下面我们就来做一些事情,消除程序里的硬编码。

我们需要定义一个表,名叫ACTION_LIST,用来表示系统中所有的行为:

ActionFactory可以根据传入的ID编号查找到对应的类型,然后使用反射的方式建立需要的实例。如果我们需要对行为进行权限控制,可以再建立一个“访问控制表”(Access Control List,简称ACL),在这个访问控制表中记录用户和行为的访问限制关系。ActionFactory在建立Action实例之后,需要参照这个ACL对Action的Enabeld属性和IsVisible属性进行设置。只要维护一个ACL,就能实现最灵活的行为权限控制。


精彩图集

赞助商链接