惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security Affairs
美团技术团队
量子位
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed
小众软件
小众软件
Microsoft Azure Blog
Microsoft Azure Blog
Apple Machine Learning Research
Apple Machine Learning Research
MongoDB | Blog
MongoDB | Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 叶小钗
N
Netflix TechBlog - Medium
大猫的无限游戏
大猫的无限游戏
J
Java Code Geeks
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Cyber Attacks, Cyber Crime and Cyber Security
Recent Announcements
Recent Announcements
Cisco Talos Blog
Cisco Talos Blog
L
LangChain Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - 三生石上(FineUI控件)
U
Unit 42
T
Tenable Blog
Security Latest
Security Latest
Scott Helme
Scott Helme
B
Blog
C
Cybersecurity and Infrastructure Security Agency CISA
NISL@THU
NISL@THU
L
Lohrmann on Cybersecurity
A
Arctic Wolf
S
Schneier on Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
酷 壳 – CoolShell
酷 壳 – CoolShell
I
Intezer
Know Your Adversary
Know Your Adversary
云风的 BLOG
云风的 BLOG
有赞技术团队
有赞技术团队
雷峰网
雷峰网
The Cloudflare Blog
Cloudbric
Cloudbric
Latest news
Latest news
Project Zero
Project Zero
S
Secure Thoughts
V
Visual Studio Blog
博客园 - Franky
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
W
WeLiveSecurity

博客园 - 木饭

码农必读的 7 本计算机书 我已经三十多岁了,我该把时间投资在哪呢? SQL SERVER 2012 第五章 创建和修改数据表 の CREATE语句 SQL SERVER 2012 第五章 创建和修改数据表 の SQL SERVER中的对象名 SQL SERVER 2012 第四章 连接 JOIN语句的早期语法结构 & 联合UNION SQL SERVER 2012 第四章 连接 JOIN の OUTER JOIN,完全连接FULL JOIN,交叉连接CROSS JOIN C#高级编程第9版 第二章 核心C# 读后笔记 SQL SERVER 2012 第四章 连接 JOIN の INNER JOIN SQL SERVER 2012 第三章 使用INSERT语句添加数据 SQL SERVER 2012 第三章 T-SQL 基本语句 having子句 SQL SERVER 2012 第三章 T-SQL 基本语句 group by 聚合函数 C#高级编程第9版 第一章 .NET体系结构 读后笔记 SQL SERVER 2012 第三章 T-SQL 基本SELECT语句用法,Where子句详细用法 无法打开物理文件 "X.mdf"。操作系统错误 5:"5(拒绝访问。)"。 (Microsoft SQL Server,错误: 5120)解决 中国福利彩票,牛B,开奖和数据传输有什么关系? Mvcpager以下各节已定义,但尚未为布局页“~/Views/Shared/_Layout.cshtml”呈现:“Scripts”。 骆驼男鞋怎么样,骆驼男鞋售后逆天,骆驼男鞋维修36天无结果。程序员屌丝的维权之路,直播。。。。。。 IOS7状态栏StatusBar官方标准适配方法 iphone原生cookie处理
MVC view页面需要多个model,复杂网页的处理
木饭 · 2015-01-27 · via 博客园 - 木饭

需求描述

一个比较复杂的页面,界面中包含的元素数据来自于许多个有关联或者无关联的表,然后我们要做的就是将数据呈现在界面上。

10年前大概都是这么干的

直接写一个复杂的SQL语句,返回一个包含所需数据的二维表,然后直接与界面开始绑定。

简单、粗暴。

今天的现状

信息化解决方案的普及,我们接到的企业应用项目很多都是在旧系统无法满足需要的情况下扩展,业务功能也将建立在原来的基础上变得更加复杂。

所以,为了解决系统复杂所带来的困惑,人们开始使用分层架构。

分出数据访问层,使得数据提供得以重用。分出业务逻辑层,使得业务逻辑得以重用。

遇到更加复杂的业务,使得领域驱动设计开始流行,它将更多的业务逻辑内聚在领域模型里面,使得更多的业务逻辑得以重用。

引出了问题

1、许多人使用了ORM工具之后,认为它只能处理简单的功能,或者认为它适合做做界面上只有单个表的增删改,总之认为它不够灵活,其实ORM工具的Model只是一个业务层的东西,不是表现层的Model。

2、碰到这种界面元素复杂的问题,就觉得分层架构根本就是扯淡,有想直接上来一条SQL语句解决问题的冲动。

我们该如何解决

1、界面元素跟单个实体对应的情况。

这种情况在微软官方的DEMO中经常出现,ASP.NET MVC 5+EF6能够自动生成增删改列表3个页面,没什么好说的。

经常容易误导我们,以为MVC中的M指的只是实体类,其实M还可以指实体的服务类,实体的服务类里面包含业务逻辑的处理。

其实M指的是业务逻辑层,不一定只包含单个实体,很可能是多个有关联的实体,或者叫聚合根。

2、界面元素跟多个有关联的实体对应的情况。

这种情况就是上面提到的聚合根,业务层包含一定的逻辑,最后返回一个聚合根给控制器(C)。

视图(View)只需要一个Model就能搞定,强类型使得你很容易就能够点出它的依赖。

让业务层做它该做的事情,别让表现层的Controller抢了业务层的饭碗。

3、更为复杂点的,界面元素跟多个无关联的实体对应的情况。

这种情况下,我们需要创建一个ViewModel,然后用它组合多个无关联的实体。

把握一个原则,业务类对应的是业务模型,ViewModel对应的是每个View。

所以上面两种处理方法只是界面元素简单的情况下减轻工作量的做法,而理论上是需要一个View对应有一个ViewModel。

4、再复杂一点,或者不止一点。

好吧,真的足够复杂的话,那就无视一切理论吧,原生SQL、存储过程、无分层,随便了。

业务逻辑写在数据库,还是写在应用程序,这取决于纵向的负载均衡,需要智慧与经验。

主题是表现层,所以不讨论数据库该不该处理业务逻辑的问题。

总结:

当界面元素比较复杂时,试着创建一个ViewModel来组合业务类去磨平它,而不是去抱怨MVC、ORM、分层架构不够灵活。

本文转载自燕十三的博客

原文标题:表现层的设计(二)——MVC如何处理复杂的界面元素