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

序言

第一篇讲解了UI与业务逻辑分层的框架(UIMediator)的使用。本篇将说明该框架的原理及代码实现。

整体结构

UI与后台类绑定主要分为UI输入->后台属性,后台属性-UI更新两部分,为符合依赖倒置原则,分别抽象出IUIToProperty和IPropertyToUI两个接口。

为了匹配WinForm的窗体事件委托方法格式(object sender, EventArgs e)两个接口方法都实现了多态。

Mediator采用了模板方法的设计模式,实现了整个绑定方法的算法框架,子类只需实现ChangeType、BindPropertyValue、BindUIValue三个抽象方法即可。

TextBoxMediator、RadioButtonMediator、CheckBoxMediator为Mediator子类,根据各个不同的WinForm控件而实现的中介类,实现了上述三个抽象方法。

ChangeType:将Control基类转换为具体的控件类;

BindPropertyValue:实现UI输入->后台属性;

BindUIValue:实现后台属性-UI更新。

UML图如下所示。接下来讲解具体代码实现。

依赖倒置

UI输入->后台属性接口:IUIToProperty

 public interface IUIToProperty
    {
       void BindPropertyValue(object sender, EventArgs e);
       void BindPropertyValue(PropertyInfo prop);
    }

后台属性-UI更新接口:IPropertyToUI

public interface IPropertyToUI
    {
       void BindUIValue(object sender, EventArgs e);
       void BindUIValue(PropertyInfo prop);
    }

Mediator模板类

 public abstract class Mediator:IUIToProperty,IPropertyToUI
    {
        protected Type type;
        protected object BindInstance;
        protected string BindProperty;

        public void Bind<T>(Control control, T BindInstance, string BindProperty) where T : class ,IPropertyChange
        {
            this.BindInstance = BindInstance as T;
            this.BindProperty = BindProperty;
            type = typeof(T);
            BindInstance.PropertyChanged += new EventHandler(BindUIValue);
            ChangeType(control);
            BindPropertyValue(null, null);
        }

        public void BindPropertyValue(object sender, EventArgs e)
        {
            BindPropertyValue(GetProperty());
        }

        private PropertyInfo GetProperty()
        {
            return type.GetProperties().First(c => c.Name == BindProperty);
        }

        public void BindUIValue(object sender, EventArgs e)
        {
            BindUIValue(GetProperty());
        }

        public abstract void BindPropertyValue(PropertyInfo prop);
        protected abstract void ChangeType(Control control);
        public abstract void BindUIValue(PropertyInfo propertyInfo);

TextBoxMediator类

public class TextBoxMediator:Mediator
    {

       private TextBox tb;
       public override void BindPropertyValue(System.Reflection.PropertyInfo prop)
       {
           if (prop.PropertyType.IsValueType && string.IsNullOrEmpty(tb.Text))
           {
               prop.SetValue(BindInstance, 0, null);
               return;
           }
           try
           {
               object value = Convert.ChangeType(tb.Text, prop.PropertyType);
               prop.SetValue(BindInstance, value, null);
           }
           catch (FormatException fex)
           {
               throw fex;
           }
           catch (Exception ex)
           {
               throw ex;
           }
       }

       protected override void ChangeType(Control control)
       {
           tb = control as TextBox;
           tb.TextChanged+=new EventHandler(BindPropertyValue);
       }

       public override void BindUIValue(System.Reflection.PropertyInfo prop)
       {
           tb.Text = prop.GetValue(BindInstance, null).ToString();
       }
    }

CheckBoxMediator类

public class CheckBoxMediator:Mediator
    {

       private CheckBox cb;
       public override void BindPropertyValue(PropertyInfo prop)
       {
           prop.SetValue(BindInstance, cb.Checked, null);
       }

       protected override void ChangeType(Control control)
       {
           cb = control as CheckBox;
           cb.CheckedChanged += new EventHandler(BindPropertyValue);
       }

       public override void BindUIValue(PropertyInfo prop)
       {
           cb.Checked = Convert.ToBoolean(prop.GetValue(BindInstance, null));
       }

    }

RadioButtonMediator类

public class RadioButtonMediator:Mediator
    {
       RadioButton rb;
       public override void BindPropertyValue(System.Reflection.PropertyInfo prop)
        {
            prop.SetValue(BindInstance, rb.Checked, null);

        }
        protected override void ChangeType(System.Windows.Forms.Control control)
        {
            rb = control as RadioButton;
            rb.CheckedChanged += new EventHandler(BindPropertyValue);
        }
        public override void BindUIValue(System.Reflection.PropertyInfo prop)
        {
            rb.Checked = Convert.ToBoolean(prop.GetValue(BindInstance, null));
        }
    }

关于后台属性-UI更新的说明

分析下Mediator类中的Bind方法

 public void Bind<T>(Control control, T BindInstance, string BindProperty) where T : class ,IPropertyChange
        {
            this.BindInstance = BindInstance as T;
            this.BindProperty = BindProperty;
            type = typeof(T);
            BindInstance.PropertyChanged += new EventHandler(BindUIValue);
            ChangeType(control);
            BindPropertyValue(null, null);
        }

泛型T有一个IPropertyChange的约束,具有PropertyChanged事件,用来注册绑定BindUIValue方法。

IPropertyChange的代码如下

public interface IPropertyChange
    {
        event EventHandler PropertyChanged;
        void UpdateUI();
    }

由于.NET只支持类的单继承,为避免框架对代码的侵入性选择了接口继承。

后台类通过继承IPropertyChange,在UpdateUI实现方法中调用PropertyChanged事件。

在需要后台驱动UI更新时调用UpdateUI方法即可。

 public void UpdateUI()
            {
                PropertyChanged(null, null);
            }
时间: 2024-10-06 05:00:19

分享一个UI与业务逻辑分层的框架(二)的相关文章

分享一个漂亮的ASP.NET MVC界面框架

本文分享一个插件化的界面框架,该框架提供了用户.角色.权限管理功能,也提供了插件的管理和插件中心.下图是该界面框架的样式(全部源码和原理介绍下一篇分享,推荐越多,源码放的越早,呵呵). 要使用该界面框架,你可以通过以下地址来下载到界面框架的Visual Studio 2013模板:下载框架模板. 模板下载地址:http://files.cnblogs.com/baihmpgy/iOpenWorksMvc1.zip 下载后,解压缩,将iOpenWorksMvc1目录直接拷贝到VS的项目模板目录(C

qml和C++混合编程,UI和业务逻辑混合

作者:seanyxie |  时间:2014-07-22 | 保存时间:2016-09-14 Qt Quick 技术的引入,使得你能够快速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket ,多线程,又如 XML 文档处理类库 QXmlStreamReader / QXmlStreamWriter 等等,在 QML 中要么不可用,要么用起来不方便,所以呢,很多时候我们是会基于这样的原则来混合

java 业务逻辑理解

细说业务逻辑 2016年10月14日 07:16:28 阅读数:2295 细说业务逻辑   前言 记得几个月前,在一次北京博客园俱乐部的活动上,最后一个环节是话题自由讨论.就是提几个话题,然后大家各自加入感兴趣的话题小组,进行自由讨论.当时金色海洋同学提出了一个话题--"什么是业务逻辑".当时我和大家讨论ASP.NET MVC的相关话题去了,就没能加入"业务逻辑"组的讨论,比较遗憾. 其实,一段时间内,我脑子里对"业务逻辑"的概念也是非常模糊的.

细说业务逻辑(一)

内容提要 ===================前篇===================== 前言 内容提要 1.我把业务逻辑丢了!——找回丢失的业务逻辑 2.细说业务逻辑 2.1.业务逻辑到底是什么 2.2.业务逻辑的组成结构 2.2.1.领域实体(Domain Entity) 2.2.2.业务规则(Business Rules) 2.2.3.完整性约束(Validation) 2.2.4.业务流程及工作流(Business Processes and Workflows) 2.3.业务逻辑

从分享机制反观产品形态与业务逻辑

本文不是我写的,转载出处:http://www.woshipm.com/pd/273760.html “分享”是一个在App中特别常见的功能,从运营层面它满足了推广需求,从用户层面则满足了用户对外塑造自我形象.分享自我点滴.宣扬价值观等需求.这次我将分析五类常见应用(社交类.内容类.电商类.美化类.打车类)的分享机制,从中反推出不同产品的产品目标.业务逻辑对分享机制的影响:接着,从用户体验的角度分析几种分享机制下不同操作流程的优缺点. 一.每类产品分享的内容形式 不同种类的产品会因为不同的产品性

如何比较好的编写一个包含业务逻辑的方法体

具体做法:先写出方法体的主体流程,细节部分先只抽象出方法暂不实现,等主体框架完成后再实现具体的细节部分. 缘由:之前的做法是建一个方法,然后把一坨业务逻辑的代码塞到方法里.这样做的问题是如果业务很复杂可能导致思路混乱,而且后期代码也不容易让别人理解.

[典型漏洞分享]业务逻辑导致的隐私泄露1

业务逻辑漏洞是跟业务自身强相关的,必须结合业务本身进行分析. 视频广场存在业务逻辑等漏洞,可导致用户隐私泄漏[高] 问题描述:          经测试,视频广场存在如下漏洞: 1.  被进行好友分享的设备可以被好友进行广场分享,可导致用户隐私泄漏. 2.  发表评论和进行回复时未限制次数和频率,可利用进行恶意刷屏或灌水. 测试步骤:          问题1: 1.  将用户A的设备à设备A通过好友分享给用户B. 2.  登录用户B,可以得到设备A的序列号以及新的cameraID(通道号).

发现 一个业务管理系统 解决了 orm 和 前端框架 剩下的 是 业务逻辑 了 。 哈

解决了 orm 和 前端框架 剩下的 是 业务逻辑 了 . 哈 还有 各种 aop 组件 呢 . 大家 high 来 准备 用 fluent data  和 mysql 写一个 wcf 的 接口呢. wcf 比 webservice 后出来吧 然后 在 用 web api 写一个 接口呢..

【开源.NET】 分享一个前后端分离的轻量级内容管理框架

开发框架要考虑的面太多了:安全.稳定.性能.效率.扩展.整洁,还要经得起实践的考验,从零开发一个可用的框架,是很耗时费神的工作.网上很多开源的框架,为何还要自己开发?我是基于以下两点: 没找到合适的:安全.稳定.简单.易用.高效.免费: 想成为架构师: 于是就自己动手,参考网上开源的项目和借鉴网友的设计思路(特别是萧秦系列博文),结合自己的实践,开发了一个简单.易用.高效的的框架,虽然不完善,但也能解决现实中的问题.不过随着见识增广,发现没负责过千万级别的项目难以成为架构师,也不可能开发出一个完