用MVC5+EF6+WebApi 做一个小功能(四) 项目分层功能以及文件夹命名
在上一节,我们完成了一个项目搭建,我们看到的是一个项目的分层架子,那接下来每一层做什么以及需要引用哪些内容呢?在本节内容我们还逐步拆分每一层的功能,顺带添加package包
Trump.Domain
在这一层,主要是定义领域模型,我们前面也说,Domain是不依赖任何层的,唯一可能存在的依赖也就是外部的帮助类库了。所以这一层不需要我们进行单独处理引用关系的。
在这一层我们主要定义一些实体和实体的行为,为了解决方案树看着清爽一些,我们分别添加几个文件夹保存对应的内容
- Entiies:保存实体类
- IRepository:保存仓储接口(后面有空单独说仓储,这里就是保存的每个实体对应的行为)
- T4:用来保存T4文件,后面会用到T4进行实体类的生成
基本这些就够了。如果有需要我们在单独添加,其实T4那个文件夹现在加不加都可以。
Trump.EF
在这一层,我们进行数据持久化操作,我们将使用Entity Framework 6+Sql Server这个组合来进行数据持久化,同时我们要实现在Domain层定义的仓储接口,还有就是在这一层还会使用Migration进行数据迁移,使用Fluent Api 来进行数据关系的配置,所以这一层的文件如下:
- Common :放我们将会用到的公用类,比如提取出来的公共仓储类
- EntityConfig:涉及到实体类的关联关系配置,我们使用Fluent Api来定义实体之间的关系
- Migrations:启用数据迁移后,自动生成的文件,不必手动创建
- Repository:仓储实现类
- XXXDbContext.cs:既然使用EF进行数据操作,必然会有一个数据上下文类,我们项目较小,就不给它自己单独搞个文件夹了,不好找
基本就这些文件夹。再看我们在EF可能会用到的类库,
- Entity Framework :这个肯定不用思考,微软给的这个ORM走过了这么多年性能什么的应该不是大问题了(猜测,我没有测试过,勿拍)。
就这个就可以了,其他的不是必须的,我们用的时候再添加就可以了。这里注意,nuget安装包EntityFramework有一个对应的EntityFramework.zh-Hans,一并安装上吧,这样在代码编写的时候就可以看到继承的中文提示了
最后,在EF层,我们继承了Domain 的仓储接口,同时也会引用Domain的实体类,所以需要依赖Domain项目。右键添加项目引用即可
Trump.Application
在这一层,我们是为了隔离UI层与EF层之间的关联,数据模型流转如下Entity→Dto→Model,其中Entity→Dto的转换就是在这一层完成的。同时我们还会把一些在页面模型中没有完成的模型组装在这里进行完。这一层文件夹如下:
- Common:公共类,一些基类,接口什么的
- Dtos:数据传输对象,把Entity转换成Dto,然后扔给UI层
- IService:应用层接口,也有人把这个文件夹单独拿出去的,我们就不折腾了搞的项目比项目功能都多何必呢
- Service:应用层实现。
其实,如果往三层上靠的话,应用层就有点类似原来的BLL层,干些没技术含量的活,但是我们在这里非要搞出来一个接口和一个实现的方式,这个并不是为了高大上,后续我们会讲到Ioc的时候会用到,同时我们在Domain中引入了T4,这块的很多代码都是可以生成的,所以不用纠结
看一下需要引用的Nuget包:
- AutoMapper:数据转换全靠它了,这个据说性能不是很好,但是也没什么好的替代品
- Newtonsoft.Json:Json序列化的,个别时候会用到。
Trump.ExamApp
最后来到UI层,用户看到的那一坨屎一样的东西都集中在这里了。这一层要调用Application获取数据,进行展示,把用户提交的表单发送给Application然后到EF层进行持久化。
这一层文件夹在创建项目的时候已经基本都完备了,看一下这一层的引用,梳理一下我们要用的技术
- AutoMapper:帮忙进行Dto→Model的转换
- Newtonsoft.Json:Json序列化用到
- Swagger.Net、Swagger.Net.UI、Swashbuckle、Swashbuckle.Core:用来做Api在线文档的,后续Api的时候单独讲
- log4net:老牌日志组件,看着说明书基本很容易配置使用了
- bootstrap:现在版本3.xxx~~~~~~
- jQuery:这个注意有三个系列,1.xx、2.xx、3.xx 根据客户端兼容性需求选择不同版本,同时会影响到页面处理时候插件的选择,慎重,原来有过不小心给升级了版本导致各种客户端各种不兼容。
- Datatables:列表组件
- jsTree:树形结构
- select2:可搜索过滤的下拉框
- sweetalert2:浏览器alert消息的替代
- jsrender:个别时候页面中重复数据绑定
- ueditor:富文本编辑器,百度出品,貌似不维护了,基本也还稳定,功能都能满足,最主要的是有中文文档和示例
- icheck、bootstrap-touchspin等:页面上功能的小优化,增强用户体验
整理项目结构截图如下:

所有准备工作基本完毕。下一步就可以开始了。
比较纠结,我个人习惯是在整理需求的时候画原型,然后设计数据模型,基本就是页面设计→模型设计→逻辑处理→功能串联→测试微调的开发思路。
但是因为这个是从项目中提出来的,需求已经弄完了而且很多代码也完了,这个有点不知道从哪开始了。
整理整理思路在继续,而且第一次想写一个实战的文章,才发现好难啊~
用MVC5+EF6+WebApi 做一个小功能(四) 项目分层功能以及文件夹命名的更多相关文章
- 用MVC5+EF6+WebApi 做一个小功能(三) 项目搭建
一般一个项目开始之前都会有启动会,需求交底等等,其中会有一个环节,大讲特讲项目的意义,然后取一个高大上的项目名字,咱这是一个小功能谈不上项目,但是名字不能太小气了.好吧,就叫Trump吧.没有任何含义 ...
- 用MVC5+EF6+WebApi 做一个小功能(二) 项目需求整理
在一个项目开始前,需求整理大概要占到整个项目周期15%甚至30%的比重,可以说需求理得越清楚,后续开发中返工几率越小.在一个项目中,开发新功能的花费的精力要远远小于修改功能的精力,这基本是一个共识.老 ...
- 用MVC5+EF6+WebApi 做一个小功能(一)开场挖坑,在线答题系统
从哪开始说呢,这几年微软的技术一直在变,像是牟足了劲要累死所有的NET程序员,从WebForm到MVC到现在MPA.SPA .Razor单页,从net2.0一直走到现在.net4.6.2,后面还有一个 ...
- 用MVC5+EF6+WebApi 做一个考试功能(五) 前端主题
内容概述 前面絮絮叨叨没正事,到现在为止也没有开始写代码,不过在考虑下貌似这一节还是开始不了. B/S架构开发有一个特点,就是用浏览器打开,不同的用户群体可能有不同的风格,不论是管理平台还是普通的网站 ...
- 用MVC5+EF6+WebApi 做一个考试功能(六) 仓储模式 打造EF通用仓储类
前言 年底工作比较忙,年度总结还没写,项目要上线,回老家过年各种准备.尤其是给长辈给侄子侄女准备礼物头都大了. 原来想年前先出一版能用的,我看有点悬了,尽量先把大体功能弄出来,扔掉一些,保证能考试,然 ...
- 使用PixiJS做一个小游戏
PixiJS PixiJS使用WebGL,是一个超快的HTML5 2D渲染引擎.作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的.轻量级而且是兼任所有设备的2D库. 官方 ...
- 用RecyclerView做一个小清新的Gallery效果 - Ryan Lee的博客
一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- 在Myeclipse中拷贝一个web项目,但是tomcat文件夹中没有更新,需要进行修改才能更新。
1.在Myeclipse中拷贝一个web项目,但是tocat文件夹中没有更新,需要进行修改才能更新. 2.方法:右键这个工程,然后Properties->MyEclipse->Projec ...
随机推荐
- 蒲公英: 一个提供App 存储、分发、Bug管理的网站
一.蒲公英内测应用, https://www.pgyer.com/ 内测应用,仅需两步: 将应用上传到网站,生成安装链接和二维码 用户在手机上打开安装链接,或扫码二维码,即可开始安装 二.蒲公英Bug ...
- .net core部署到linux可能碰到的问题
缺少icu库以独立部署 (SCD)的方式发包,运行时报错错误信息:FailFast: Couldn't find a valid ICU package installed on the system ...
- 【C#】转一篇MSDN杂志文:ASP.NET Pipeline: Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code
序:这是一篇发表在2003年6月刊的MSDN Magazine的文章,现在已经不能在线阅读,只提供chm下载.讲的是异步请求处理那些事,正是我上一篇博文涉及的东西(BTW,事实上这篇杂志阐述了那么搞然 ...
- 在Asp.Net MVC中利用快递100接口实现订阅物流轨迹功能
前言 分享一篇关于在电商系统中同步物流轨迹到本地服务器的文章,当前方案使用了快递100做为数据来源接口,这个接口是收费的,不过提供的功能还是非常强大的,有专门的售后维护团队.也有免费的方案,类似于快递 ...
- Tree with Small Distances(cf1029E)(树形动规)
You are given an undirected tree consisting of \(n\) vertices. An undirected tree is a connected und ...
- 使用sqlmap对进行php+mysql注入实战
作者:陈小兵一般来讲一旦网站存在sql注入漏洞,通过sql注入漏洞轻者可以获取数据,严重的将获取webshell以及服务器权限,但在实际漏洞利用和测试过程中,也可能因为服务器配置等情况导致无法获取权限 ...
- Apache Roller 5.0.3 XXE漏洞分析
下载5.0.2的版本来分析 5.0.2的war包地址 http://archive.apache.org/dist/roller/roller-5/v5.0.2/bin/roller-weblogge ...
- [LeetCode] Z字型变换
题目内容: 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:" ...
- 如何开启windows的linux子系统
win10一周年纪念版 1607的版本增加了bash,bash,bash,windows的shell中可以直接运行bash了. 下面说一下配置步骤: 1.设置 —更新和安全—针对开发人员,选择开发人 ...
- odoo开发基础--模型之基本字段类型
定义模型的时候,和python的其他框架类似,可以对比Django,同样是一个模型即:一个class对应生成数据库中的一张表, 只是odoo的继承机制比较复杂一点,在日常的开发中,定义模型的时候, 基 ...