创建好项目后,解决方案资源管理器窗口里我们看到,增加了不少文件夹及文件,如下图所示:

  

  在解决方案文件夹中,找到项目文件夹,该文件夹又包含五个子文件夹 -Models、Controllers、Views、Properties、及wwwroot;Models、Controllers、Views对应MVC模型,控制器和视图。 Properties文件夹包含一个文件(launchSettings.json),它控制Visual Studio如何运行和调试应用程序。 wwwroot文件夹很特别,因为它是应用程序中浏览器可以直接访问的唯一的文件夹,你可以在这里面存放应用需要用到的CSS,JavaScript,图片或静态HTML文件。 浏览器无法访问wwwroot之外的文件。虽然磁盘上存在wwwroot和Properties文件夹,但您可以看到解决方案资源管理器将它们显示为特殊节点,不按字母顺序排列,位于项目的顶部区域。 在项目中还有两个特殊的节点,Dependencies和Connected Services,它们在磁盘上没有相应的文件夹。 它们显示项目所有依赖项的集合,例如NuGet包、客户端依赖项和项目所依赖的远程服务。在目根目录中,还有几个JSON文件-appsettings.json、bundleconfig.json和bower.json。 它们提供了各种配置设置,其中一些在运行时使用,另一些在编译时用于构建应用程序。(Bower是一个客户端资产管理系统,用于获取CSS和JavaScript库。 由于Bower被放弃维护,ASP.NET团队正在探索替代方案。 bower.json文件很可能会在后面的版本中从默认模板中删除并替换)。项目中最重要的文件是WebApplication2.csproj,因为它描述了如何构建你的项目。 Visual Studio未在解决方案中显式列出csproj文件,但可以在项目名称右键并选择“编辑”菜单对其进行编辑。Visual Studio还在项目文件夹中列出了两个C#文件-Program.cs和Startup.cs。 在后面的章节,将介绍这两个类是如何实现配置和运行您的应用程序的。

csproj项目文件:定义依赖项

  csproj文件是.NET应用程序的项目文件,包含.NET工具构建项目所需的详细信息。 它定义了正项目的类型(Web应用程序、控制台应用程序、类库),项目的目标平台(.NET Core、.NET Framework 4.5、Mono等),以及项目所依赖的NuGet包。项目文件一直是.NET应用程序的核心,ASP.NET Core对其进行了调整,使其更易于阅读和编辑。 这些调整如下:

  1、没有GUID  - 以前,全局唯一标识符(GUID)大量用于项目文件中;

  2、隐式文件包括 (Implicit file includes—)- 以前,项目中的每个文件都必须列在csproj文件中,项目才能编译; 现在,文件会被自动编译;

  3、没有NuGet包dll的路径 - 以前,csproj必须包含dll的路径,以及在packages.xml文件中列出依赖项。 现在,您可以直接在csproj中引用NuGet包,不需要指定磁盘上路径;

  这些变化使项目文件更加简洁,下图显示了整个csproj文件:

  

  上图中Project元素的Sdk属性设定编译项目的默认设置,TargetFramework元素设定应用程序的运行框架,对于.NET Core 2.0项目,值为netcoreapp2.0; 对于完整的.NET Framework 4.6.1项目,值为net461。对于简单的应用程序,我们不需要更改项目文件,如果你想编辑csproj文件,不用像之前的版本那样先关闭项目,直接用前面提到的方法编辑即可。对项目文件最常见的更改是添加项目引用(PackageReference元素下NuGet包),.NET Core项目默认情况下,只引用一个NuGet包-Microsoft.AspNetCore.All,它是一个元数据包(元数据包是一个不包含代码的NuGet包,它引用一个或多个其他NuGet包,通过将元数据包添加到应用程序,可以方便地和隐式地添加它的所有包引用),包含了ASP.NET Core 2.0相关的所有软件包,但这不意味着,应用将使用所有的ASP.NET Core包。在ASP.NET Core 2.1中,Microsoft.AspNetCore.App元数据包引用默认已经安装上。 您可以在https://github.com/aspnet/Announcements/issues/287 查看Microsoft.AspNetCore.App和所有元数据包的区别。

  简化后的项目文件更易手工编辑,这有利于开发跨平台应用。如果仍然使用Visual Studio,你依然可以像以前一样添加项目引用,管理NuGet包等。有关csproj格式更改的更多详细信息,可参阅https://docs.microsoft.com/en-us/dotnet/core/tools/csproj。

Program类:构建Web主机

  所有ASP.NET Core应用程序的启动方式与.NET控制台应用程序相同 - 使用Program.cs文件。 此文件包含静态 Main函数(这是控制台应用程序的标准特性)。 应用中必须包含这个方法,它在启动Web应用程序时调用。 在ASP.NET Core应用程序中,它用于构建和运行一个IWebHost实例,如下图所示,它显示了默认的Program.cs文件。 IWebHost是ASP.NET Core应用程序的核心,包含应用程序配置和侦听请求的Kestrel服务器,并返回客户端请求回应。

  

  Main函数包含创建Web服务器并开始侦听请求所需的基本初始化代码,在实例化IWebHost之前,通过CreateDefaultBuilder方法定义IWebHost的配置。应用程序的大部分配置都发生在CreateDefaultBuilder方法中,它还将一些职责委托给一个单独的类Startup。 这个类通过泛型方法UseStartup<> 引用,在这里可以配置应用程序的服务和中间件间。

  这里有不少人提出这样的疑问,为什么要把配置分拆到两个类中?一般来说,Program类负责应用的基础结构,例如:Http服务器、与IIS集成、配置源;Startup定义应用将使用哪些功能、组件以及中间件。如下图所示:

 

  两个不同的ASP.NET Core 应用程序的Program类通常是相似的,但Startup类通常会有很大不同(尽管它们通常遵循类似的模式)。 随着应用程序的增长,很少会修改Program,但是,会经常修改Startup。 例如,向项目中添加新的NuGet依赖项,通常需要在Startup添加相应的代码才能使用。

Startup类:配置应用程序

  Startup类主要负责应用的两个方面的配置:

    1、服务注册 - 您的应用程序所依赖的任何类 ,无论是框架使用的类还是应用程序自身需要使用的类都必须注册,只有这样,这些类才能在运行时被正常构建;

    2、中间件和MVC  - 应用程序如何处理和响应请求;

  在不同的方法中配置这两个方面的功能,服务注册在方法ConfigureServices中,中间件和MVC 在方法Configure中。这两个方法大致的样子如下所示:

  Program中创建的WebHostBuilder先调用 ConfigureServices 然后调用Configuare,如下图所示:每个调用都会配置应用程序的不同部分。由于这样的调用顺序,Configuare方法中可以使用在ConfigureServices方法中注册的任何服务。调用完成后,WebHostBuilder通过调用Build()方法,创建IWebHost. 有一个地方需要注意,Startup类自身没有实现相应的接口,WebHostBuilder通过反射来调用预义的方法Configure和ConfigureServices,这样的设计使这个类更加灵活,我们可以修改签名,添加额外的参数。更详细的细节将在后面章节介绍。

谢谢你的阅读,下节见!如果期待本系列,请点一下推荐!

《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1的更多相关文章

  1. 《ASP.NET Core In Action》读书笔记系列一 ASP.NET Core 的诞生

    最近打算系统学习一下asp.net  core ,苦于没有好的中文书藉,只好找来一本英文的 <ASP.NET Core In Action>学习.我和多数人一样,学习英文会明显慢于中文.希 ...

  2. 《ASP.NET Core In Action》读书笔记系列三 ASP.NET Core如何处理请求的?

    在本节中,您将看到ASP.NET Core应用程序如何运行的,从请求URL开始到页面呈现在浏览器中. 为此,您将看到 一个HTTP请求在Web服务器中是如何被处理的.ASP.NET Core如何扩展该 ...

  3. asp.net MVC4 框架揭秘 读书笔记系列3

    IIS/ASP.net管道 本节全部用图形表示便于理解和记忆 1.3.1 IIS5.x与asp.net 1.3.2 IIS 6.0与asp.net 1.3.3 IIS7.0与asp.net 基于IIS ...

  4. 《ASP.NET Core In Action》读书笔记系列二 ASP.NET Core 能用于什么样的应用,什么时候选择ASP.NET Core

    ASP.NET Core 能用于什么样的应用 ASP.NET Core 可以用作传统的web服务.RESTful服务.远程过程调用(RPC)服务.微服务,这归功于它的跨平台支持和轻量级设计.如下图所示 ...

  5. asp.net MVC4 框架揭秘 读书笔记系列2

    1.2 MVC 变体 MVC 是一种Pattern 另外一种说法是ParaDigm 范例 模式和范例的区别在于前者可以应用到具体的应用上,而后者则仅仅提供一些指导方针 1.2.1 MVP Model ...

  6. asp.net MVC4 框架揭秘 读书笔记系列1

    1.1 传统MVC 名词解释 Autonomous View. AV. 自制视图 GUI图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式 ...

  7. 《ASP.NET Core In Action》读书笔记系列,这是一个手把手的从零开始的教学系列目录

    最近打算系统学习一下asp.net  core ,苦于没有好的中文书藉,只好找来一本英文的 <ASP.NET Core In Action>学习.我和多数人一样,学习英文会明显慢于中文.希 ...

  8. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  9. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

随机推荐

  1. 网页布局之grid

    学习网格布局时,你可能会在网络上看到很多文章,内容不同,属性不同,真是让人摸不着头脑,到底哪个才是正确的?看了本篇文章,我想你会豁然开朗.比如,一会儿用grid-rows,一会儿用grid-defin ...

  2. python 进程间通信(上)

    一  使用queue来实现进程间的内存共享 #_*_coding:utf-8_*_ from multiprocessing import Process,Queue import os,time d ...

  3. css 背景(background)属性、背景图定位

    background属性: Background属性是css中应用比较多,且比较重要的一个属性,它是负责给盒子设置背景图上和背景颜色的,background是一个复合属性,它可以分解成如下几个设置项: ...

  4. Laravel使用redis保存SESSION

    Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...

  5. Linux——模拟实现一个简单的shell(带重定向)

    进程的相关知识是操作系统一个重要的模块.在理解进程概念同时,还需了解如何控制进程.对于进程控制,通常分成1.进程创建  (fork函数) 2.进程等待(wait系列) 3.进程替换(exec系列) 4 ...

  6. mobile_轮播图_transform 版本_transform 读写二合一

    轮播图_transform 版本 关键点: 2D 变换 transform 不会改变 元素 在 文档流 中的位置 定位 position 会改变 元素 在 文档流 中的位置 语句解析太快,使用 set ...

  7. 前端性能优化 —— reflow(回流)和repaint(重绘)

    简要:整个在浏览器的渲染过程中(页面初始化,用户行为改变界面样式,动画改变界面样式等)reflow(回流)和repaint(重绘) 会大大影响web性能,尤其是手机页面.因此我们在页面设计的时候要尽量 ...

  8. 剑指offer——python【第60题】把二叉树打印成多行

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行.#类似于二维列表[[1,2],[4,5]] 解题思路 其实这倒题和其他类似的题有所区别,这里是分层打印,把每层的节点值放在同一 ...

  9. layer过去的时间不能选择,只能选择未来的时间 LayUI中的时间日期控件,设置时间范围,

    默认Layui中的时间控件显示如下: 我当时系统时间是2018-06-07, 我需要做的是2018-06-07之后过去的时间不能选择 <p><span>时间范围:</sp ...

  10. 一个人工智能教程,教案接地气、限制级。 http://www.captainbed.net

    一个人工智能教程,教案接地气.限制级. http://www.captainbed.net https://open.weibo.com/