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

推荐订阅源

D
DataBreaches.Net
Engineering at Meta
Engineering at Meta
AI
AI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Schneier on Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
F
Fortinet All Blogs
T
Threat Research - Cisco Blogs
B
Blog
K
Kaspersky official blog
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
U
Unit 42
NISL@THU
NISL@THU
D
Docker
Vercel News
Vercel News
C
Check Point Blog
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
C
CERT Recently Published Vulnerability Notes
J
Java Code Geeks
Hugging Face - Blog
Hugging Face - Blog
Latest news
Latest news
Martin Fowler
Martin Fowler
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
Know Your Adversary
Know Your Adversary
A
Arctic Wolf
L
LINUX DO - 热门话题
IT之家
IT之家
SecWiki News
SecWiki News
博客园 - 【当耐特】
Schneier on Security
Schneier on Security
C
Cybersecurity and Infrastructure Security Agency CISA
The Last Watchdog
The Last Watchdog
S
Secure Thoughts
P
Proofpoint News Feed
N
News and Events Feed by Topic
S
Security @ Cisco Blogs
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
爱范儿
爱范儿
罗磊的独立博客
C
Cyber Attacks, Cyber Crime and Cyber Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cloudbric
Cloudbric
O
OpenAI News
V
V2EX
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园 - 谭洪星

NHibernate教程(转载) 混乱的MVC,.NET非要MVC不可么?(转) ASP.NET实现URL映射 PetShop的系统架构设计(转) ASP.NET中常用的优化性能方法 设计模式学习笔记(三)——Abstract Factory抽象工厂模式 (转) 观察者模式及实现(转) 悟透JavaScript (转) 深入研究Asp.net页面的生命周期 [你必须知道的.NET] 第一回:恩怨情仇:is和as Net中的反射使用入门 .Net 中的反射(反射特性) - Part.3 .net反射简介 软件工程心理学之---让客户知错,但不能向你发怒 用AJAX.NET的客户端脚本实现UpdateProgress的效果 - 谭洪星 - 博客园 C#(也适用其他)的初学者对string是值类型还是引用类型搞不清楚,还有对参数传递也比较迷糊 C#泛型之详解 [你必须知道的.NET]第十二回:参数之惑---传递的艺术(下) [你必须知道的.NET]第十一回:参数之惑---传递的艺术(上)
MVC模式在.NET框架中的应用与实现
谭洪星 · 2008-06-20 · via 博客园 - 谭洪星

0           引言

.NET开发平台是由微软公司近年来推出的新型体系结构,在Microsoft .NET框架下,建立大型的Web应用和Web服务变得更加便捷。如何在.NET框架下构建健壮的、易维护、可复用的Web应用和服务,下面以肉仔鸡肠胃道微生物信息分析(GMIAS)系统为例介绍了具体的解决方案。

系统采用了MVC设计模式,很好的实现了控制逻辑、业务逻辑、数据逻辑和显示a

人们在发现问题并寻找问题的解决方案的过程当中,经常会遇到一些问题重复出现并不断改变面孔,而这些问题的背后往往有着共同的本质,这些“共同的本质”就是模式的概念。在当今面向对象的软件开发过程当中,人们经常会把软件的开发过程分解成若干个不同的设计模式,从而提高代码复用程度、降低开发复杂度、提高项目开发效率。所以设计模式就是一系列的对象以及对象间的关系,并据此对某一特定的软件设计问题提供一个稳定的、可扩展的方案。

1.2           MVC设计模式

MVC设计模式是Model(模型)-View(视图)-Controller(控制器)的简称。最初是在20****70年代由施乐(Xerox)Palo Alto研究中心(PARC , Palo Alto Research Center)被提出的。MVC模式最先被用来在第一代基于视窗的计算机上管理GUI和用户交互[2]。近些年开始被推荐应用在J2EE平台上。近两年来,随着ASP.NET技术在大型Web应用上的地位得到巩固,MVC这个最为广为人知、最著名的设计模式在.NET平台上也逐渐开始得到应用[2],并已成为当今设计交互式应用事实上的标准[1]。

MVC模式通过区分各个层,允许组成每个层的各个组件间松散地耦合。这使得程序开发更加灵活,并且可以减少重复性代码,实现代码重用。

模型组件表示应用程序的数据,并包括这些数据的访问和修改的业务规则,它表达了程序所使用的数据和生成数据的运行状态。它独立于用户界面和I/O操作。

视图组件是用户看到并与之交互的界面,主要负责从模型访问数据指定如何表示数据,并当模型改变时,维护表示的一致性。视图也负责把用户动作传递给控制器。

控制组件定义应用程序的行为,解释用户动作,并把它映射为模型执行的过程。它负责模型和视图之间的交互,控制对用户输入的响应方式和流程。它主要包括两个动作:一方面将用户的请求分发到相应的模型,另一方面将模型的改变及时反映在视图上。

2           MVC模式在.NET框架下的实现

2.1     MVC模式的应用模型

.NET 采用“code-behind”代码来处理显示页面的用户交互。即每个aspx文件都对应一个“code-behind”源代码文件。通过“code-behind”实现了逻辑控制代码与脚本语言、HTML等代码的分离。本系统按照三层Web结构划分为表示层(Web)、业务层(Biz)和数据层(DAO)。表示层由Web窗体组成,实现View和Controller的功能;业务层包括业务实体组件和业务逻辑组件;数据层包括数据对象、数据访问组件等,由业务层和数据层共同实现Model的功能。通过映射MVC模式三个部分到.NET体系结构中的相应的组件,构建了基于MVC模式在.NET框架下的肉仔鸡肠胃道微生物信息分析系统应用模型。如图二所示。

2.2     View的实现

在.NET开发环境中设计视图十分便捷,View由aspx文件来实现。Visual Studio .NET在视图设计器的工具箱中提供了数据、Web窗体、组件、HTML等各种控件,同时还为我们提供了用户控件。用户控件是一种直观的可重用的模型,扩展名为.ascx。它可以是最简单HTML控件、服务器控件或多个控件嵌套构成的Web自定义控件。通过以上各种控件,我们可以像开发Windows界面一样方便的通过所见即所得的方式进行可视化设计。本系统中视图与各模块中的aspx文件相对应,aspx文件与系统中的各个用户界面相对应。

2.3     Controller的实现

.NET中的代码分离机制使View中的代码与Model及Controller中的代码能够很容易的分离。每个aspx对应了一个后端代码aspx.cs,通过aspx.cs来实现Controller的功能。每个ASP.NET页面都有一种机制,将页面中的控件所要调用的方法在一个与其分离的类中实现。这些 aspx 和 ascx 文件后端代码继承了System.UI.Web.Page的类执行控制器功能,它包括了各种初始化和控制函数。当加载aspx页面时将调用Page_Load事件,当aspx页面从内存中被卸载时将调用Page_Unload事件。如果某个控件触发页面以使其被重新加载则将调用Control Event事件。在本系统中, Controller负责接收、截取并处理用户请求、处理各种事件,通过调用Model中的业务逻辑组件来对获取各种数据对象,根据当前状态和业务操作的结果决定向客户呈现的视图,控制aspx页面的显示。以肉仔鸡肠胃道微生物信息分析系统中基本试验数据管理模块中视图ExpInfo.aspx对应的Controller为例,具体实现如下文:

public class ExpInfo: System.Web.UI.Page

     {

         protected System.Web.UI.WebControls.DataGrid dgExpInfoList; // 声明DataGrid控件

         ExpInfoBiz expInfo = new ExpInfoBiz();     //实例化对应业务逻辑类

         private void Page_Load(object sender, System.EventArgs e)

         {            

               if(!IsPostBack)     //是否为响应客户端回发而加载该页

               {

                   this.BindDataExpInfo();  

               }

         }

         public void BindDataExpInfo()     //绑定数据方法

         {

               DataSet Ds = new DataSet();   //定义DataSet对象

               Ds = expInfo.GetExpInfo();   //调用业务逻辑类中的方法,由GetExpInfo()调用DAO内方法获取试验信息的数据集

               this. dgExpInfoList.DataSource = Ds.Tables[0].DefaultView; //获取数据源

               this. dgExpInfoList.DataBind();//绑定控件到指定数据源

         }

     }

2.4     Model的实现

Model用来管理应用程序域的行为和数据。在本系统中将业务逻辑、与数据库连接和交互的公共操作封装在单独的类中,用专门的类来处理业务逻辑和数据逻辑,提高了代码的重用性。具体实现方式为:在公用的基本类库中,定义DataBase类作为数据库操作的基本类。在DataBase类中与数据库连接和交互的公共操作的方法之一的实现代码如下文:

public class DataBase     // 对数据库操作的基本类

     {

public DataSet RunProc(string SQL) // 执行SQL语句,返回DataSet对象

         {

               SqlConnection = new SqlConnection(ConnStr); // 建立SQL连接

               SqlDataAdapter Da = new SqlDataAdapter(SQL,Conn);   // 创建SqlDataAdapter对象并实现连接的打开和关闭

               DataSet Ds = new DataSet();// 创建DataSet对象

               Da.Fill(Ds);           // 填充数据到DataSet中

Da.Dispose();       // 释放SqlConnection对象

               return Ds;       // 返回DataSet对象

         }

}

应用程序在DAO中引用公用基本类中的方法RunProc()来获取数据对象:

public class ExpInfoDao:BaseObjectDTO   // 继承所有数据对象的基类BaseObjectDTO

     {

public DataSet GetExpInfo()   // 从数据库中获取试验信息      

{

string sql ="select * from ExpInfo"; //SQL查询语句

               return DB.RunProc(sql);         //调用数据库操作的基本类中RunProc()方法

         }

}

Controller不直接对Model中的数据逻辑进行操作,而是通过业务逻辑获取DAO层中的数据对象。Biz层由.cs文件组成,其中业务逻辑组件封装了具体的处理逻辑。以下为最简单的返回一个DataSet的处理逻辑。

public class ExpInfoBiz

     {

ExpInfoDAO expInfo = new ExpInfoDAO();       //实例化对应数据逻辑类

public DataSet GetExpInfo()               // 得到包含试验信息的一个DataSet

{

               return expInfo.GetExpInfo();       //调用DAO层ExpInfoDAO类中的GetExpInfo()方法

         }

}

最后,Controller中的事件调用业务逻辑方法,并且把响应提交到对应的视图组件以产生响应,完成客户端表单数据的描述。

0           结束语

本文基于MVC模式,设计和开发了一个肉仔鸡肠胃道微生物信息分析系统。采用了当今开发大型Web应用的两大平台之一Microsoft .NET,用Visual C#.NET设计完成。系统实现了应用程序模块化,是一个具有良好安全性、可扩展、易维护的交互式系统。所设计系统满足了用户需求,增强了试验数据分析和管理的自动化程度,辅助了用户对“肉仔鸡胃肠道微生物与饲料营养的相互作用及其对肉品质的调控机理”研究的进一步深化。由此可见应用MVC设计模式于.NET平台实现Web应用开发具有十分现实的意义。

参考文献

[1]杨晓江,王继成. .NET Web应用的MVC设计[J].计算机工程与应用.2003.26

[2][美]James Turner ,Kevin Bedell 著.Struts KICK START

. 北京:电子工业出版社.2004

[3]庞开放,李龙澍.基于.NET框架的Web应用与实现[J].微机发展.第15卷 第3期.2005年3月

[4][阿根廷]Daniel Cazzulino 著.Beginning C# Web Applications with Visual Studio .NET

.北京:清华大学出版社,2003

[5] Eiiti, Hanyuda ,MVC dance: Connecting software development and corporeality from agile process and pattern language perspectives,Proceedings - Second International Conference on Creating, Connecting and Collaborating Through Computing, Proceedings - Second International Conference on Creating, Connecting and Collaborating through Computing, 2004, p 174

[6]张计龙,张成洪,张凯等,基于改进MVC的高校人事管理系统,计算机工程[J],2004年第30卷第8期