一般一个项目开始之前都会有启动会,需求交底等等,其中会有一个环节,大讲特讲项目的意义,然后取一个高大上的项目名字,咱这是一个小功能谈不上项目,但是名字不能太小气了。好吧,就叫Trump吧。没有任何含义,玩嘛!

项目分层结构也要在这里说一下,这次这个小功能仿照DDD的分层模式,一定记住我说的是仿照。因为我也不懂DDD,我就画个皮。

DDD这个东西中文名字应该叫领域驱动设计,园子很多大神分享过、讲解过。看了很多博客很多书,依然没太理解这么复杂的东西(没有实践,纸上得来终觉浅)。这里简单说说自己的理解,把业务逻辑尽量的集中在领域层(Domain),如果项目是人体,那领域层就是人体的大脑了,以现在的科技,身上的零件除了大脑基本都可替换。也许可以把大脑换到另一个人身上,但是,整个身子还是要听大脑的指挥。如果身体没有了大脑,基本上就是一滩肉,失去了作为机体的功能。

另外作为一个机体,还远远没有达到想电脑那样的低耦合度,所以大部分零件更换的成本都很高。即使是一台电脑,要更换零件也是要考虑到整体平台的架构等等信息,所以谈到低耦合,可替换的时候在不是万般无奈情况下,使用的几率很小。

放到项目上的一个例子,比如引入工作单元、仓储层的概念,就是为了隔离领域与数据持久化,但是真正项目上线,要替换数据持久化的那一层谈何容易。基于项目现有应用场景,然后进行技术选型的时候,要综合开发效率,开发成本,可扩展性,可维护性等等,并不是什么高大上就用什么,什么概念都要涉及,那样只会成为一场技术点堆砌而难以实际应用。

比如我们这个项目,就是一个小的功能,现在可预估的用户量就是你我他,你非要在还没上线没成型就考虑百万级用户的扩展,估计这个项目永远都没法上线了。

技术没有好坏,只有适合不适合!当然,php是最好的语言,这是世间真理!

以一种领域专家、设计人员、开发人员都能理解的通用语言作为相互交流的工具,在交流的过程中发现领域概念,然后将这些概念设计成一个领域模型;
由领域模型驱动软件设计,用代码来实现该领域模型;

由此可见,领域驱动设计的核心是建立正确的领域模型

要详细了解DDD的概念可以打开上面的链接,包括下方图片,也是从文章中粘过来的,在此我们只是用他的分层,并没有实践DDD。

领域驱动设计的经典分层架构

小功能的分层

我们这个小项目分四层,分别为

  • Trump.Domain 主要存放模型,不引用任何项目
  • Trump.EF 实现数据持久化内容,本案中使用EF6,所以这里会有大量EF CRUD实现的操作,依赖Domain项目
  • Trump.Application 实现数据与UI的交互,经过EF处理的数据在这一层转接为DTO返回到UI层,依赖Domain、EF项目
  • Trump.ExamApp UI层实现,使用MVC5+Web Api+jQuery+Bootstrap构建,依赖Domain、Application层。

一般项目中还会有一个帮助类的项目,提供一些常用方法封装,扩展方法等,并不作为任何项目独有,所以这里就不列出来了。

创建解决方案及创建项目(Vs 2017)

来吧来吧,新建空白解决方案,然后添加MVC项目,名字叫Trump.ExamApp,这个很基础很基础的,只列一下注意点

1.选择ASP.NET Web应用程序.NET Framework ,上面那个是传说中的跨平台版本。比较落伍,看了几回视频都是第几集。

2.选择MVC,同时勾选Web API(不勾选亦可以,可以通过Nuget添加),身份验证那里选择不进行身份验证。()

身份验证:

不进行身份验证:不使用net自带的身份管理

个人用户账号:集成Asp.Net Identity v2(.NET Framework) or v3+(.NET Core)版本

3.创建完毕后如图

4.使用Nuget管理项目中的引用

在项目上右键,管理Nuget程序包,移除“Microsoft.ApplicationInsights”。Application Insights 是可扩展的应用程序性能管理 (APM) 服务,可让 Web 开发人员在多个平台上生成和管理应用。暂时用不到,但是package有好几个,习惯性移除掉,然后就是升级一下除了jQuery外所有的包。

注意:因为兼容性问题,jQuery版本不要随便变更

好了。到此为止,这个项目基本完毕,接下来就是按照约定的名字创建其他几个项目,选择类型为类库(.NET Framework)。

都创建完毕后,刷新一下,然后生成解决方案。把Web项目设置为启动项目,F5启动调试,我们整个项目的架子基本搭建完毕。

用MVC5+EF6+WebApi 做一个小功能(三) 项目搭建的更多相关文章

  1. 用MVC5+EF6+WebApi 做一个小功能(二) 项目需求整理

    在一个项目开始前,需求整理大概要占到整个项目周期15%甚至30%的比重,可以说需求理得越清楚,后续开发中返工几率越小.在一个项目中,开发新功能的花费的精力要远远小于修改功能的精力,这基本是一个共识.老 ...

  2. 用MVC5+EF6+WebApi 做一个小功能(四) 项目分层功能以及文件夹命名

    在上一节,我们完成了一个项目搭建,我们看到的是一个项目的分层架子,那接下来每一层做什么以及需要引用哪些内容呢?在本节内容我们还逐步拆分每一层的功能,顺带添加package包 Trump.Domain ...

  3. 用MVC5+EF6+WebApi 做一个小功能(一)开场挖坑,在线答题系统

    从哪开始说呢,这几年微软的技术一直在变,像是牟足了劲要累死所有的NET程序员,从WebForm到MVC到现在MPA.SPA .Razor单页,从net2.0一直走到现在.net4.6.2,后面还有一个 ...

  4. 用MVC5+EF6+WebApi 做一个考试功能(五) 前端主题

    内容概述 前面絮絮叨叨没正事,到现在为止也没有开始写代码,不过在考虑下貌似这一节还是开始不了. B/S架构开发有一个特点,就是用浏览器打开,不同的用户群体可能有不同的风格,不论是管理平台还是普通的网站 ...

  5. 用MVC5+EF6+WebApi 做一个考试功能(六) 仓储模式 打造EF通用仓储类

    前言 年底工作比较忙,年度总结还没写,项目要上线,回老家过年各种准备.尤其是给长辈给侄子侄女准备礼物头都大了. 原来想年前先出一版能用的,我看有点悬了,尽量先把大体功能弄出来,扔掉一些,保证能考试,然 ...

  6. 使用PixiJS做一个小游戏

    PixiJS PixiJS使用WebGL,是一个超快的HTML5 2D渲染引擎.作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的.轻量级而且是兼任所有设备的2D库. 官方 ...

  7. 用RecyclerView做一个小清新的Gallery效果 - Ryan Lee的博客

    一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...

  8. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  9. 我的第一个netcore2.2 api项目搭建(三)

    上一章快速添加了swagger文档管理功能,我的第一个netcore2.2 api项目搭建(二) 这一章实现目标三:api添加身份验证功能 在实现该目标之前,先得理解netcore运行机制. 这是微软 ...

随机推荐

  1. linux下创建具有root权限的账户

    http://blog.chinaunix.net/uid-24631445-id-2981034.html

  2. ES6系列_11之Set和WeakSet数据结构

    一.Set 1.Set是什么? Set是ES6 提供的一种新的数据结构.类似于数组. 2.Set能解决什么问题 Set和Array 的区别是Set不允许内部有重复的值,如果有只显示一个,相当于去重. ...

  3. could not be installed at this time

    无法下载应用 此时无法安装 Unable to Download App ''App" could not be installed at this time 编译程序的时候,Target ...

  4. FoxPro 数据库文件及记录命令

    ADDTABLE 在当前数据库中添加一个自由表 APPEND 在表的末尾添加一个或多个新记录 APPEND FROM ARRAY 由数组添加记录到表中 APPEND FROM 从一个文件中读入记录,追 ...

  5. JPA with Hibernate implementation

    https://code.google.com/p/jpa-basics-tutorial/source/checkout http://alextretyakov.blogspot.com/2013 ...

  6. objects & values & types

    [objects & values & types] 1.Every object has an identity, a type and a value. An object’s i ...

  7. onItemLongClick+onCreateContextMenu实现长按ListItem弹出不同菜单

    个ListActivity,长按不同的item弹出的菜单不一样 参照

  8. sql unsigned

    1.数字类型无符号化,取0以上的值    学习传送门  http://www.cnblogs.com/blankqdb/archive/2012/11/03/blank_qdb.html

  9. 基于注解的方式管理Bean

    --------------------siwuxie095                                 基于注解的方式管理 Bean         (一)准备         ...

  10. QByteArray to QString

    QByteArray => QString void BarEngine::ByteArrayToString(QByteArray &ba, QString &str) { i ...