分享一个UI与业务逻辑分层的框架(一)

序言                                                                               

.NET(C#)的WinForm如何简单易行地进行UI与业务逻辑分层?本系列文章介绍一个WinForm分层框架,该框架针对WinForm中的TextBox,CheckBox,RadioButton三种UI控件进行简单粗暴的UI与业务逻辑分层实现。

背景

软件行业发展至今,分层的思想可谓是深入人心。企业应用架构模式中三层架构的思想早以众人皆知,MVC的框架正在引领着WEB开发的潮流。但在MES系统开发这块,虽然众多厂商均标榜自身产品皆采用分层架构,但细究下也只是框架上做到了分层,在粗粒度上还是会出现混层的情况。从笔者近年来接触的MES系统来看真正做到细粒度的分层基本上可以说是没有。尤其是WINFORM这块,UI与业务逻辑基本上是混杂在一起,给单元测试和代码重用带来了极大的困难。不仅在产品上有这样的情况,在程序员教育上也存在同样的问题。君不见,21天入门到精通系列基本上都是UI和业务逻辑混杂在一起,初级程序员基本上也都是一个窗体文件加一个CS文件直接解决问题。

原因分析

  • UI与业务逻辑代码写在一起,简单粗暴。

  • UI与业务逻辑分层的难度和技巧要求较高,特别是在WINFORM下。(ASP.NET下还有MVC框架)

框架简介

框架参照Mediator模式(隐式中介模式)进行UI与业务逻辑分离,支持TextBox,CheckBox,RadioButton三种UI控件,生成UIMediator.dll。

项目中通过引用UIMediator.dll使用。

框架演示

  • UI界面说明

如上所示:From1为UI,txtName为TextBox控件,cbCheck为CheckBox控件,rbButton1、rbButton2为RadioButton控件。

  • 新建后台逻辑类

新建From1Class为后台(业务逻辑)类,继承IPropertyChange(命名空间UIMediator)接口并实现方法,如下代码所示:

复制代码
 public class Form1Class : IPropertyChange
    {

        public event EventHandler PropertyChanged;

        public void UpdateUI()
        {
            PropertyChanged(null, null);
        }

    }
复制代码
  • 在后台逻辑类定义与UI控件相对应的属性

复制代码
     private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        private bool check;
        public bool Check
        {
            get { return check; }
            set { check = value; }
        }

        private bool radio1;
        public bool Radio1
        {
            get { return radio1; }
            set { radio1 = value; }
        }

        private bool radio2;
        public bool Radio2
        {
            get { return radio2; }
            set { radio2 = value; }
        }
复制代码
  • 在Form1代码内关联UI与业务逻辑类

 Form1Class fc = new Form1Class();
  • 在Form1窗体加载事件中绑定UI控件与业务逻辑类属性

     private void Form1_Load(object sender, EventArgs e)
            {
                MediatorManager.Bind(txtName, fc, "Name");
                MediatorManager.Bind(cbCheck, fc, "Check");
                MediatorManager.Bind(rbButton1, fc, "Radio1");
                MediatorManager.Bind(rbButton2, fc, "Radio2");
            }

 应用

  • UI输入-->后台属性

不用写代码,UI控件的输入或选择能及时被后台业务逻辑类的属性所感知

  • 后台属性-->UI显示

在后台业务逻辑类中驱动UI显示时只需要调用UpdateUI方法

原文地址:https://www.cnblogs.com/huangmianwu/p/5824527.html