WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)
原文:WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)

我们第一步就是去了解三层架构和问题然后去看MVVM是怎么去解决这些问题的。

现在,感觉和事实是完全不同的两个东西。当你看到三层架构的框图的时候,你会觉得每层的职责被分配的很好。但是当你你真的去写代码的时候你会发现其实一些层被迫去做本不应该他们做的额外的事情(违反了SOLID原则的S)。

这个额外的工作就是在UI-Model和Model-Data access之间的代码。让我们就把这些代码称为“GLUE”代码。有两种主要的逻辑会造成“GLUE”代码(也许我知道的并不够多,其他的可以自己发现):

1.映射逻辑(绑定逻辑):每一层通过属性,方法,集合来和其他层进行通信。举个例子,一个在UI层的叫做“txtCustomerName”的textbox和customer类的“CustomerName”属性进行关联。

txtCustomerName.text=custobj.CustomerName;//mapping code

现在谁拥有上面的绑定逻辑代码,是UI还是Model层?开发者一般把这个代码推到UI层。

2.转换逻辑:数据格式在不同的层是不一样的。比如,一个“Person”类有一个叫”Gender“的属性又包含“F”和“M”,但是在UI层,我们希望看到一个checkbox,“checked”(true)代表male,“unchecked”(false)代表female。下面是一个转换的示例代码。

if(obj.Gender==”M”)//transformation code
chkMale.IsChecked=true;
else
chkMale.Ischecked=false;

大多数的开发者会在UI层写这样的“GLUE”代码。为了把这些代码分的详细一般可以在背后的代码找到答案,比如.cs文件等。因此如果先”xaml”然后”xaml.cs”会有粘合代码,先”aspx”再“aspx.cs”也会有粘合代码等等。

现在有一个问题:粘合代码是UI的职责么?让我们来看一个WPF程序的例子和粘合的代码的细节。

下面是一个简单的”Customer”模型类,有3个属性“CustomerName”,”Amount”和”Married”字段。

但是这个模型在UI层展示的时候,它和下面展示的一样。因此,你能看到它包含模型的所有字段同时也加上了一些额外的东西,看color label 和 married check box。

下面是一个简单的图表,左边是模型的字段,右边是UI的字段。中间是关于映射和转换的逻辑的描述。

你可以看到前2个字段我们没有任何的转换逻辑,他们只有映射的逻辑。其他2个字段映射和转换的逻辑都有。

转换和映射的逻辑通常都在后台代码中,就如“XAML.CS”。下面就是上面customer screen的后台代码,你可以看到映射代码,颜色的判断代码和性别格式转换代码。我给代码添加了注释方便你可以看到哪是映射代码,哪是转换代码。

现在围绕GLUE代码有几个问题:

1.违反SRP:这样的GLUE代码是UI的职责么?如果你知道了当时的情况,在amout的值改变的时候,UI的代码也要做出改变。那为什么当数据改变的时候我需要去改变我的UI代码。似乎可以嗅到不良代码的味道。UI应该是只有在我改变styles,colors,positoning等的时候才会要改变。

2.重用性:如果我想把同样的颜色逻辑和性别转换用在下图这样的一个编辑的界面上,我怎么去做呢?我去复制粘贴去创建重复的代码?

假如我想去领先一步把粘合代码用在不同的UI技术上,像MVC,Windows form 或者mobile。

但是由于UI背后的规范和UI技术关系很紧密,这样跨不同UI技术的重用事实上是不可能的。

例如,下面的代码是继承自“Window”类。”Window”类和WPF UI 技术关系很紧密。因此,如果我们想把这个逻辑用在Web应用或者MVC上时,我们怎样去创建一个这个类的对象并且去消耗它。

public partial class MainWindow:Window
{
//behind code is here
}

我们怎么去重用后台代码?我们怎么去遵守SRP?

posted on 2018-06-04 00:03 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9131382.html

WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)相关推荐

  1. 一个简单的三层架构例子(.NET入门)

    最近开始学习.NET 用的是c# 目前要用三层架构的模式开发一个简单的图书管理系统,不过以为刚接触这门技术.做起来分外吃力,甚至连究竟要写些什么都不清楚. 于是乎上网到处找寻三层架构的基础入门知识,终 ...

  2. mysql 三层架构开发_搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi

    这里我们用三层架构搭建一个连接MySql的ASP.netCore模板的WebApi项目 首先添加WebApi项目(ASP.NetCore版本) 右键解决方案>新建项目> 选择Web> ...

  3. WPF三层架构的搭建

    开发工具与关键技术: Visual Studio 2019.C#语言.WPF.MVC三层架构 作者:邓李庆 撰写时间: 2021年2月08日 小编首先来给大家介绍一下,什么是三层架构:三层架构就是为了 ...

  4. WPF MVVM从入门到精通1:MVVM模式简介

    WPF MVVM从入门到精通1:MVVM模式简介 原文:WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录 ...

  5. 使用objectdatasource结合数据绑定控件进行简单三层架构的开发

    对于B/S架构的三层架构的开发,可能很多的人都已经了解的是比较清楚的.哪么我在这里用的是最简单的三层架构.ui+bll+dal+dbsqlhelp+model. 从05出来以后由于功能明显比03夸张了 ...

  6. c#利用三层架构做一个简单的登录窗体

    就个人而言,三层架构有点难理解,不知道该如何下手,各层与各层之间怎么调用 最近一直在研究三层架构,经过网上学习与多方打听写一下自己的心得.有不足之处,可以评论和私聊探讨 言归正传: 三层架构(3-ti ...

  7. 关于MVC与三层架构、个人总结网上杂七杂八得出的最终成果、asp.net (core) MVC、JavaWeb的MVC

    阅读本文必须明白的事情 首先需要明白的是不同语言实现的MVC与三层架构对应的层是不一样的!!! 拿.net来说,.net实现MVC与其他语言的MVC具体实现是不同的,asp.net MVC与 MVC ...

  8. MVC模式与三层架构的区别

    MVC模式与三层架构的区别 原文地址:http://www.cnblogs.com/yourshj/p/5197310.html 之前总是混淆MVC表现模式和三层架构模式,为此记录下. 三层架构和MV ...

  9. 浅析三层架构与MVC模式的区别

    浅析三层架构与MVC模式的区别 三层架构介绍: (点击链接即可见三层架构) MVC模式介绍: MVC全名是Model ViewController,是模型(model)-视图(view)-控制器(co ...

最新文章

  1. wamp配置虚拟域名
  2. Java Threads 多线程10分钟参考手册
  3. 装运点确认失败的排查
  4. Safari上使用WebRTC指南
  5. 面向对象和面向过程_程序员给你解释:面向对象和面向过程的区别,到底是怎么回事?...
  6. 以空格为分隔符读取内容给两个变量_问与答61: 如何将一个文本文件中满足指定条件的内容筛选到另一个文本文件中?...
  7. hibernate连接MySQL数据库
  8. .net中序列化读写xml方法的总结
  9. 微信小程序picker选择器(下拉框)以及传值问题
  10. WPS文字目录怎么做?目录制作的三种方法
  11. 2019杭电多校Problem 5 Snowy Smile题解
  12. Java之支付宝支付(电脑网站支付)案例实战
  13. Microsoft Help Viewer无法打开的问题
  14. ffmpeg里转场transition
  15. java 遍历出d盘所有文件_JAVA遍历一个文件夹中的所有文件
  16. 实验吧-密码学-疑惑的汉字(当铺密码)
  17. 搭建本地Spring Initializr服务(2020/4/17)
  18. 为了快 0.00007 秒,有家交易公司花 1400 万美元买了块地
  19. matlab 实现高阶动态电路,高阶电路动态特性的仿真分析
  20. 鸿蒙宴文言知识积累,文言文鸿门宴知识点汇总

热门文章

  1. osgi框架 android,基于OSGi的Android应用模块动态加载框架设计与实现
  2. 图纸管理软件_造价20万以内的农村别墅长啥样?挑选5套图纸,让城里人羡慕吧...
  3. QuerWrapper常用方法
  4. spring源码分析第三天------spring核心IOC容器和依赖注入原理
  5. MATLAB电压不平衡,电力系统不对称故障计算的Matlab算法程序
  6. oc引导win方法_[OC更新]机械革命8代、9代标压稳定版更新
  7. linux讲日志暂停,linux – Rsyslog在日志轮换后停止向远程服务器发送数据
  8. java list 获取索引_java – 获取arrayList中元素的索引
  9. memcached 使用 java_使用Java java_memcached client的陷阱
  10. web前端期末大作业--奥迪RS汽车主题官网设计(HTML+CSS+JavaScript)实现