浅谈ASP.NET中多层架构

很多人对开发多层应用程序感到一定的困难。来看一个例子:对于一个只有一两个人的小公司,一个人可能同时担当老板、出纳、会计、市场、销售、开发等多项工作。而对于一个大公司,就会进行比较严密的分工,每个人只完成一部分工作,需要彼此配合才能保证正常运转。以前的开发程序就类似于一个小公司,从用户界面到数据库访问等所有功能都在一个页面内完成,这样的缺点有:

1. 开发起来比较困难,很难实现多人协作开发

2. 一旦数据库或规则有变,就可能要重新修改整个页面,加大维护成本

3. 因为所有功能都混合在一起,程序重用性差。如果开发一个新项目,几乎要重写代码

为了解决这个问题,人们就提出了“多层应用程序”概念,其本质类似于一个职权明确的大公司,对页面进行分工,将数据访问、业务规则等功能都放在专门的文件中。比较流行的有二层架构、三层架构和MVC。

一. 二层架构

二层架构,就是将程序分为用户界面层和数据访问层。其本质是将访问数据库的代码放入数据访问层中,而用户界面层通过数据访问层对数据库进行操作。 相互作用关系如下:("<--->"表示双向箭头)

用户界面 <---> 数据访问 <---> 数据库

二. 三层架构

三层架构,即将二层架构中的业务逻辑从数据访问层中分离出来,成为一个单独的业务逻辑层。将程序分为三层后,数据访问层就只管对数据库进行操作,而业务逻辑层负负责对数据进行各种处理。
从顶层上主要包含了4个部件:DAL(数据处理层)、BLL(业务逻辑层)、UI(用户接口层)、Model(实体模型)。其中前三者就是人们常说的三层结构。
    1)数据访问层(database access layer,DAL):有时候也称为是持久层,其功能主要是负责数据库的访问。简单的说法就是实现对数据表的Select,Insert,Update, Delete的操作。如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化;
    2)业务逻辑层(business logic layer, BLL):是整个系统的核心,它与这个系统的业务(领域)有关;
    3)表示层(user interface layer, UIA):是系统的UI部分,负责使用者与整个系统的交互。在这一层中,理想的状态是不应包括系统的业务逻辑。表示层中的逻辑代码,仅与界面元素有关;
   4)实体模型层(Model):包含了所有的数据信息,这些数据信息以各种Entity实例的形式存在。是整个系统基础层次;

完善的三层结构应该是:修改表示层而不用修改逻辑层,修改逻辑层二不用修改数据访问层。达到一定程度上的解耦。

三层架构主要是使项目结构更清楚,分工更明确,有利于后期的维护和升级。它解决了整个应用程序中各个业务操作过程中不同阶段的代码封装的问题,使程序员更加专注的处理某阶段的业务逻辑。然而未必会提升性能,因为当子程序模块未执行结束时,主程序模块只能处于等待状态。这说明将应用程序划分层次,会带来其执行速度上的一些损失。但从团队开发效率角度上来讲却可以感受到大不相同的效果。

需要注意的是,虽然三层架构有很多的好处,但如果你的程序很简单,或者将来肯定不会重用,或不一定要采用两层架构,也许采用两层或普通的程序开发速度会更快。要根据实际情况具体处理。

三. MVC

M 即Model(模型层),主要负责出来业务逻辑以及数据库的交互;
        V 即View(视图层),主要用于显示数据和提交数据;
        C 即Controller(控制器),主要是用作捕获请求并控制请求转发;

MVC是在应用程序(BS结构)的视图层划分出来的不同功能的几个模块,主要是为了解决应用程序用户界面的样式替换问题,把展示数据的 HTML 页面尽可能的和业务代码分离。

四. 三层结构与MVC的区别

区别的话,看图就能明白:

图2. MVC 与 三层架构的区别

三层架构是界面层(UI)业务逻辑层(BLL)和数据访问层(DAL)构成的,而MVC是模型层(M)界面层(View)和控制层(Controller)构成的,而且他们之间也不对应。
        如果硬要给他们对应的话,那么三层架构中的UI对应MVC中的view都是用于显示以及获取界面的数据;三层架构中的BLL层和DAL层对应MVC中的Model层都是用于处理上层传递来的数据以及从数据库获取的数据的;MVC中的Controller最多算是三层架构中的UI的一部分。

五. 三层架构引用关系

Model层:不引用任何项目;
DAL层:引用Model,通过读取web.config里的程序集,加载类的实例,返回给BLL使用;
BLL层:引用Model,DAL;
UI层:引用Model, BLL;

方法是在资源管理器中右击项目文件,添加引用。在弹出的对话框中选中项目标签,选择适当的类库后点击确定。然后再在项目文件中添加using “引用类的命名空间”。

项目已经添加了引用,但仍然找不到指定类库文件,可检查:
            1. 引用的项目中是否有语法错误,是否在头文件中添加using “命名空间”;
            2. 添加的类库时,是否该类库为public。

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • 白刃之战:PHP vs. ASP.NET(节选)-架构比较

    作者:Robert Lair and Jason Lefebvr Intensity Software, Inc. 翻译:EasyChen Exlcsoft.com 概观 开发界正在进行的一个争论是PHP和ASP中哪一个平台更适合网站开发.这场争论由于微软的ASP.net带来的巨大变化而进入了新时期.和ASP 3.0比起来,ASP.NET采用了全新的设计,有着很多新的特性和优点.究竟ASP.NET 会给PHP和ASP之间的争论带来什么样的影响呢?本文将为你提供这个问题的答案的相关信息. 架构比较

  • 浅析.NET逻辑分层架构

    一.基础知识准备: 1.层的原则: (1)每一层以接口方式供上层调用. (2)上层只能调用下层. (3)依赖分为松散交互和严格交互两种. 2.业务逻辑分类: (1)应用逻辑. (2)领域逻辑. 3.采用的层: (1)表示层(用户接口层):领域无关. (2)服务层(应用层):应用逻辑. (3)业务逻辑层(领域层):领域逻辑. (4)共享层:提供通用代码. (5)实现层:提供接口实现. 4.约定: (1)领域层默认采用领域模型 (2)数据访问层默认需要引用领域模型 二.分层架构 分层架构的三个基本层

  • asp.net实现三层架构的例子

    看了2天的三层架构,其实自己以前也看过这个,可以由于没有使用过,所以对于三层架构也只是知道罢了,昨天看了一下他一些内部的具体架构,三层分别是BLL.WEB.DAL,在web接受用户请求,bll处理业务,dal处理数据库事务,下面是一个简单的例子!这是一个添加新员工的页面: 后台代码如下: usingSystem.Collections; usingSystem.Web; usingSystem.Web.Security; usingSystem.Web.UI; usingSystem.Web.U

  • Asp.net 在三层架构中事务的使用实例代码

    接触3层也有一段时间了,了解水平一般,前段时间在想在三层中怎么使用事务呢,放在哪呢?Sqlherper ? DAL? BLL?.然后我就疯狂的百度,好几次都是未果(因为做的都是小项目,不用事务也关系不大),今天我再次查时,好好的看了csdn上的以讨论,http://topic.csdn.net/u/20091101/19/f21697d7-8f0c-4eb3-8e59-d0fe2f0b04b0.html,结合前辈和高手们的意见,自己改了一个出来.我的想法是将事务逻辑写在业务逻辑层,数据库的处理还

  • ASP.NET MVC5网站开发咨询管理的架构(十一)

    一.总体说明 1.实现功能 2.类图 由于文章部分把大部分类都是实现了,这里仅多了一个Consultation类. 二.创建咨询模型类 在Ninesky.Models项目添加类Consultation(咨询模型),该模型跟Article类似都是CommonModel的扩展. 1.添加Consultation类. using System; using System.ComponentModel.DataAnnotations; namespace Ninesky.Models { /// <su

  • ASP.NET MVC5网站开发文章管理架构(七)

    一.总体说明 先看一下文章管理设想要实现的功能: 再看一下类图 这里Category是栏目:CommonModel是公共模型:Article是文章:Attachment是附件: CommonModel是内容管理这块抽取出来的公共部分,像文章,咨询甚至产品都有一些共同的内容这里把它单独提取出来作为一个类.CommonModel可能包含一片文章,包含一组附件,包含一系列评论,他们之间的关系类图中已经表示出来.  二.搭建架构 这个顺序根以前一样 1.IDAL 在IDAL添加接口InterfaceCo

  • 浅谈ASP.NET中多层架构

    很多人对开发多层应用程序感到一定的困难.来看一个例子:对于一个只有一两个人的小公司,一个人可能同时担当老板.出纳.会计.市场.销售.开发等多项工作.而对于一个大公司,就会进行比较严密的分工,每个人只完成一部分工作,需要彼此配合才能保证正常运转.以前的开发程序就类似于一个小公司,从用户界面到数据库访问等所有功能都在一个页面内完成,这样的缺点有: 1. 开发起来比较困难,很难实现多人协作开发 2. 一旦数据库或规则有变,就可能要重新修改整个页面,加大维护成本 3. 因为所有功能都混合在一起,程序重用

  • 浅谈ASP.NET中最简单的自定义控件

    ASP.NET用户控件一般适用于产生相对静态的内容,所以没有builtin的事件支持.本文讨论用户控件返回事件的方法. 假定用户控件(UserControl.ascx)中包含按钮控件AButton,希望实现按AButton按钮时,包含该用户控件的页面可以接收到事件.为此,小鸡射手在用户控件和页面的代码中分别作了处理. UserControl.ascx.cs中的处理:         1. 定义public的事件委托,如ClickEventHandler;         2. 在UserCont

  • 浅谈ASP.NET中MVC 4 的JS/CSS打包压缩功能

    今天在使用MVC4打包压缩功能@Scripts.Render("~/bundles/jquery") 的时候产生了一些疑惑,问什么在App_Start文件夹下BundleConfig.cs文件内 bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js", "~/Scripts/jquery.unobtrusive-a

  • 浅谈ASP.NET Core 中jwt授权认证的流程原理

    1,快速实现授权验证 什么是 JWT ?为什么要用 JWT ?JWT 的组成? 这些百度可以直接找到,这里不再赘述. 实际上,只需要知道 JWT 认证模式是使用一段 Token 作为认证依据的手段. 我们看一下 Postman 设置 Token 的位置. 那么,如何使用 C# 的 HttpClient 访问一个 JWT 认证的 WebAPI 呢? 下面来创建一个 ASP.NET Core 项目,尝试添加 JWT 验证功能. 1.1 添加 JWT 服务配置 在 Startup.cs 的 Confi

  • 浅谈ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的实现方法

    在HTTP POST请求中,我们多次在View和Controller中看下如下代码: 1.View中调用了Html.AntiForgeryToken(). 2.Controller中的方法添加了[ValidateAntiForgeryToken]注解. 这样看似一对的写法其实是为了避免引入跨站请求伪造(CSRF)攻击. 这种攻击形式大概在2001年才为人们所认知,2006年美国在线影片租赁网站Netflix爆出多个CSRF漏洞,2008年流行的视频网址YouTube受到CSRF攻击,同年墨西哥一

  • 浅谈ASP.NET Core静态文件处理源码探究

    前言 静态文件(如 HTML.CSS.图像和 JavaScript)等是Web程序的重要组成部分.传统的ASP.NET项目一般都是部署在IIS上,IIS是一个功能非常强大的服务器平台,可以直接处理接收到的静态文件处理而不需要经过应用程序池处理,所以很多情况下对于静态文件的处理程序本身是无感知的.ASP.NET Core则不同,作为Server的Kestrel服务是宿主到程序上的,由宿主运行程序启动Server然后可以监听请求,所以通过程序我们直接可以处理静态文件相关.静态文件默认存储到项目的ww

  • 浅谈TypeScript3.7中值得注意的3个新特性

    前言 距typescript 3.7正式发布已经有一段时间了,这段时间正在对手上的项目进行typescript的迁移工作,所以会特别留意每一次的release. 对于3.7中包含的新特性,其实相比较之前几次release来说,算是一个比较小的发布版本,但是其中包含的几个特性对代码质量本身,会带来显著地提升. Optional Chaining 首先第一个特性是对于optional chaining操作符的支持,翻译过来应该可以叫做可选链操作符,当然我还是觉得这样翻译有点怪怪的,暂且就直接用英文好

  • 浅谈ASP.NETCore统一处理404错误都有哪些方式

    目录 方式一 方式二 自定义通配路由 方式三 方式四 方式五 web.config <customErrors> 节点中配置ASP.NET管道处理404错误 总结 当未找到网页并且应用程序返回 404 错误时,ASP.NET Core MVC 仅呈现通用浏览器错误页面,如下图所示 这不是很优雅,是吗?我们平时看到的404页面一般是这样的 还有这样的 试了下京东,地址不存在的时候是会重定向到首页 下面就来演示下ASP.NET Core中如何实现这种自定义的404页面处理. 新建项目 ASP.NE

  • 浅谈Redis高并发缓存架构性能优化实战

    目录 场景1: 中小型公司Redis缓存架构以及线上问题实战 场景2: 大厂线上大规模商品缓存数据冷热分离实战 场景3: 基于DCL机制解决热点缓存并发重建问题实战 场景4: 突发性热点缓存重建导致系统压力暴增 场景5: 解决大规模缓存击穿导致线上数据库压力暴增 场景6: 黑客工资导致缓存穿透线上数据库宕机 场景7: 大V直播带货导致线上商品系统崩溃原因分析 场景8: Redis分布式锁解决缓存与数据库双写不一致问题实战 场景9: 大促压力暴增导致分布式锁串行争用问题优化 场景10: 利用多级缓

  • 浅谈XML Schema中的elementFormDefault属性

    elementFormDefault属性与命名空间相关,其值可设置为qualified或unqualified 如果设置为qualified: 在XML文档中使用局部元素时,必须使用限定短名作为前缀 sean.xsd: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sean=&

随机推荐