C#框架结构分层:三层结构,DDD,MVC,MVVM,MVP

本文主题,讲解主要有哪些分层思想。

一、三层结构

作为早期程序开发的经典,这是一个完全由程序员自己控制的分层思想。
在我们自己所有的项目中,几乎是无处不在,无时无刻不在使用。

它的主要思想是分界面层(UI)、业务逻辑层(BLL)、数据访问层(DAL),不管去到哪里,这3个都少不掉的。之后的各种分层,大体都离不开三层结构的影子,或者受一些影响。

界面层(UI):指html界面那些。
业务逻辑层(BLL):指您的模型类和数据逻辑操作。
数据访问层(DAL):指您对数据库进行操作,一般指CRUD,即增删改查。

它在Visual Studio中的表现类似这样子:

UI层调用逻辑层BLL,再调用数据访问层DAL即可。

二、MVP

这是一个通常使用于android开发的时候的分层。划分为视图层(View)、模型层(Model)、中间层(Presenter)。

视图层(View):也就是界面层,它调用中间层(Presenter)。指手机界面。
模型层(Model):更具体的说是模型管理层,它调用中间层(Presenter)。指模型管理。
中间层(Presenter):从它的英文Presenter来看,是主持人的意思。也就是它会负责协调视图层和模型层之间的沟通,本层通常持有视图层的对象以及模型层的对象,可以对它们做协调操作。

它的本质是通过回调来完成通讯的。

二、MVC

这是一个较常用的分层思想,它主要用于网站建设。划分为模型(Model)、视图(View)、控制器(Controller)。

视图层(View):是指界面层,也就是html代码那部分。
模型层(Model):指对应于界面,给界面使用的Model实体类。
控制器(Controller):可以操作模型层的实体,它控制数据流向模型对象,并在数据变化时更新视图。它强制使视图与模型分离开。

在VisualStudio中,就有一个专门的MVC模型模板。下图是VS2019创建一个MVC模型应用程序的截图:

三、WebApi

它实现了前后端分离,是目前前端开发工程师和后端开发工程师共同合作的最好的协同方式,彼此之间尽量减少干扰。

它跟MVC是一样的,只不过视图层(View)放在了前端开发工程师的手上。而MVC的话,视图层还未分离,跟后端代码仍然是结合在一起的。

WebApi是目前主流的前后端程序员工作方式。

四、MVVM

这是作为C#程序员才有的独家秘诀,至少目前是,以后是不是就不知道了。
独家是因为,MVVM目前仅用于WPF和Xamarin开发。这2种都是微软产品,所以才说是C#程序员才有的独家秘诀。

它分为以下几个层:

视图层(View):就是界面层了,类似于html形式的,只不过在这里是用xaml语言来描述的。
模型层(Model):这个也很好理解,就是把界面上需要用到的属性参数啊什么的,构建成一个模型类即可,即建立一个Model类。这个Model类专门给这个视图界面使用的。
视图模型层(ViewModel):对于没有使用过WPF或者Xamarin的程序员来说,要理解这层可就头大了,因为它很难想明白。它的作用就是将Model类的对象,绑定到视图层View上。简单的说,就是负责绑定数据源,即给界面层的的控件的DataSource赋上值。

五、DDD

目前很火的后端开发模型。中文叫领域驱动设计(domain-driven design,简称DDD)。通常这个模型用于前后端分离的后端项目中。

我自己主要作为后端开发的角色,所以,我最常用的就是这个分层思想了:领域模型。

它主要分为:

界面层(Host或UI):当然就是前端界面啦。一般是分离的,可能有专门的前端进行维护。
应用层(Application):跟界面层打交道的服务层(Service),通常是以提供WebApi的方式跟界面层互动。
数据共享层(Share):本层一般不是必需的,但建议您拥有。主要是定义服务接口,用于多方使用。同时,本层也可以定义Dto对象,即数据交换类。什么是数据交换类?一般我们不建议数据库实体(Entity)直接显示给前端使用,而是经过转换成一个模型(Model)后,再把这个数据给前端看。比如数据库中的字段有身份证敏感信息,如果你一股脑就把Entity暴露给前端,问题就大了。所以要有一个数据交换,也就是Dto。
领域层(Domain):也就是我们三层结构中所说的业务逻辑层。是DDD的业务核心。负责连接应用层(Application)和数据仓储层(Database)。
数据访问层(Database):好理解,就是操作数据库了。

关于DDD领域模型,目前最好的例子,是ABP(AspNet Boilerplate )。关于Abp是个什么东西,你可以自行搜索一下。

特别感谢网友“山西大风”的批评指正:

祝您用餐愉快。

(0)

相关推荐