zoukankan      html  css  js  c++  java
  • 如何使用MVC编写Winform程序代码

    efwplus开源框架官网:www.efwplus.cn

    前提:业务分析设计已完成,界面设计完成

     
    1.代码结构划分
    1)界面层:FrmSugeryApplyList、ISugeryApplyList
    2)控制器层:SugeryApplyController
    3)模型:无(使用DataTable存储数据,无实体类)
     
    2.ISugeryApplyList的设计
    1)界面上控件加载数据和获取控件数据
    注:“控件五”内的控件因为是同时显示数据,或同时保存数据,所以我们当成一个控件处理,保持接口的简洁
    public interface ISugeryApplyList:IBaseView
        {
            //加载控件数据
            void loadPatientList(DataTable dt);//控件一
            void loadApplyList(DataTable dt);//控件三
            void loadPatientInfo(int patientId);//控件四
            void loadApplyInfo();//控件五
     
            //获取控件数据
            void getApplyInfo();//控件五
            int getApplyId { get; }//当前手术申请
        }
    • 为什么控件二的数据获取没有封装成接口?我们把界面上的数据传递给控制器有两种方式,一种是通过接口,另一种是通过控制器方法的参数。
    一般只有一个方法用到的数据我用参数,多个方法都用到肯定用接口,还有就是参数太多了就用结构封装起来。
    接口中获取数据可以理解为全局变量。
    所以控件二就没有用接口传数据,而是准备当作参数传。
    • 为什么接口会有getApplyId这个属性?因为有些数据是隐藏在控件之外的,界面上无需展示但又逻辑上少不了的(分析出这些数据是难点)。
     
     
    2)除了数据,还有一些界面行为模式也可以封装成接口
    public interface ISugeryApplyList:IBaseView
        {
            //加载控件数据
            void loadPatientList(DataTable dt);//控件一
            void loadApplyList(DataTable dt);//控件三
            void loadPatientInfo(int patientId);//控件四
            void loadApplyInfo();//控件五
     
            //获取控件数据
            void getApplyInfo();//控件五
            int getApplyId { get; }//当前手术申请
     
            //界面行为模式
            ApplyInfoControlEnabledStyle setEnabledStyle { set; }
        }
     
        public enum ApplyInfoControlEnabledStyle
        {
            默认,编辑
        }
    • setEnabledStyle属性,默认下控件五为只读,编辑下控件五的数据可以修改。界面打开“控件五”为“默认”模式,当点击“控件五”上的“新增”或“修改”变为“编辑”模式,完后点击“保存”或“取消”又回到“默认”模式。
    • 把界面行为封装起来肯定会让逻辑更清晰,另外一个好处就是控制器也可以通过接口操作界面行为,比如:界面在编辑模式下,我们修改了控件一的病人,所有数据将重新加载,同时控件五也必须回到“默认”模式,而这些操作都可以在控制器完成,无需在界面上编写任何代码。
     
    3.SugeryApplyController的设计
    习惯于把控制器的方法分为,界面显示前的“数据初始化”,操作界面时的”数据交互“
    public class SugeryApplyController : BaseController<ISugeryApplyList>
        {
            //数据初始化
            public override void InitLoad()
            {
                DataTable patDt = null;//科室病人数据
                DataTable applyDt = null;//手术申请数据
     
                //从数据库获取数据
                //todo
     
                IfrmView.loadPatientList(patDt);
                IfrmView.loadApplyList(applyDt);
            }
            //查询申请单列表
            public void SearchApplyList(int patientId, int state)
            {
                DataTable applyDt = null;//手术申请数据
                //todo
                IfrmView.loadApplyList(applyDt);
            }
            //获取申请单详细信息
            public void GetApplyInfo(int applyId)
            {
            }
            //删除申请单
            public void DeleteApply(int applyId)
            {
            }
            //保存申请单
            public void SaveApply()
            {
            }
        }
    ”数据交互“方法设计一定要符合实际业务的操作,而不是直接是界面控件事件。
    比如界面修改了控件一的病人、选择了控件二的状态都有控件各自的事件,但是事件内调用的都是控制器中得SearchApplyList方法。
    其实界面上的操作都已经把实际业务给复杂化了,而控制器就是要保持与实际业务一致
     
    4.界面调用控制器代码
    //双击申请网格
            private void dgvData_DoubleClick(object sender, EventArgs e)
            {
                int applyId = 0;//todo
                controller.GetApplyInfo(applyId);
            }
     
     
     
     efwplus开源框架官网:www.efwplus.cn
  • 相关阅读:
    BEM(Block–Element-Modifier)
    http://element.eleme.io/#/zh-CN/component/quickstart
    Commit message 的写法规范。本文介绍Angular 规范(
    好的commit应该长啥样 https://github.com/torvalds/linux/pull/17#issuecomment-5654674
    代码管理
    if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary
    Martin Fowler’s Active Record design pattern.
    The Zen of Python
    Introspection in Python How to spy on your Python objects Guide to Python introspection
    Object-Oriented Metrics: LCOM 内聚性的度量
  • 原文地址:https://www.cnblogs.com/kakake/p/4971569.html
Copyright © 2011-2022 走看看