有时候,越是基础的东西,越是有人不明白。

前几天Review一个项目的代码,发现非常基础的内容,也会有人理解出错。

今天,就着这个点,写一下Dotnet Core的主要类型的项目结构,以及之间的转换和演化。

一、最基础的应用Console

控制台应用,是Dotnet Core乃至前边的Dotnet Framework中,最基础的项目。

我们来创建一个Console项目看一下:

  1. % dotnet new console -o demo

创建完成后,打开工程。工程里只有一个文件Program.cs,里面只有一个方法Main

  1. namespace demo
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. Console.WriteLine("Hello World!");
  8. }
  9. }
  10. }

在Dotnet Core所有类型的项目中,Program.cs都是最开始的入口,main方法,也是最开始的入口方法。

这个工程中,还有一个文件也需要了解一下,demo.csproj,这是这个项目的定义文件:

  1. <Project Sdk="Microsoft.NET.Sdk">
  2. <PropertyGroup>
  3. <OutputType>Exe</OutputType>
  4. <TargetFramework>net5.0</TargetFramework>
  5. </PropertyGroup>
  6. </Project>

这里面,OutputType告诉编辑器这个工程编译后可以直接执行,TargetFramework定义运行的框架。

注意,这个框架字串有个对照表:net5.0对应的是.Net 5.0;如果你想用Dotnet Core 3.1,对应的字符串是netcoreapp3.1,而不是net3.1。准确的说,3.1是.Net Core 3.1,而5.0是.Net 5.0。不用太纠结,微软的命名规则而已。

    为了防止不提供原网址的转载,特在这里加上原文链接:https://www.cnblogs.com/tiger-wang/p/14267942.html

这就是控制台应用Console的初始状态。

下面,我们看看这个工程如何转变为Web应用。

二、转为Web应用

第一件事,我们需要改动demo.csproj项目定义文件。

Web应用跑在WebHost上面,而不是从直接执行。所以,我们需要把OutputType项去掉。

另外,SDK也需要改一下。Console我们用的是Microsoft.NET.Sdk,Web应用要改成Microsoft.NET.Sdk.Web

  1. <Project Sdk="Microsoft.NET.Sdk.Web">
  2. <PropertyGroup>
  3. <TargetFramework>net5.0</TargetFramework>
  4. </PropertyGroup>
  5. </Project>

改完保存。

这时候,应该可以注意到,项目的发生了变化:

  • 依赖的框架从Microsoft.NETCore.App变成了两个,多了一个Microsoft.AspNetCore.App,表明现在这是一个Asp.net Core的应用;
  • 项目中自动生成了一个目录Properties,下面多了一个文件launchSettings.json。这个文件大家应该很熟悉,就不解释了。

这时候,应用已经从Console转为了Web应用。

Asp.Net Core框架提供了Host供Web加载。我们需要做的,是把Host构建器加到程序中。通常,我们需要两个构建器:

  • 通用主机 Generic host builder
  • Web主机 Web host builder

1. 配置通用主机

通用主机在Microsoft.Extensions.Hosting.Host中,主要给Web应用提供以下功能:

  • 依赖注入
  • 日志
  • 配置 IConfiguration
  • IHostedService实现

加入通用主机很简单,就一个方法CreateDefaultBuilder

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Host.CreateDefaultBuilder(args)
  6. .Build()
  7. .Run();
  8. }
  9. }

2. 配置Web主机

Web主机才是真正与Web相关的内容,主要实现:

  • Http支持
  • 设置Kestrol服务器为Web服务器
  • 添加IIS支持

加入Web主机,也是一个方法ConfigureWebHostDefaults

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Host.CreateDefaultBuilder(args)
  6. .ConfigureWebHostDefaults(webBuilder =>
  7. {
  8. })
  9. .Build()
  10. .Run();
  11. }
  12. }

这个方法用来添加Http请求管道并注入我们需要的服务。而注入我们需要的服务,就是我们最常见的Startup.cs的内容。

下面,我们先创建Startup.cs

  1. namespace demo
  2. {
  3. public class Startup
  4. {
  5. }
  6. }

在前边ConfigureWebHostDefaults中,加入Startup,并补齐代码:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Host.CreateDefaultBuilder(args)
  6. .ConfigureWebHostDefaults(webBuilder =>
  7. {
  8. webBuilder.UseStartup<Startup>();
  9. })
  10. .Build()
  11. .Run();
  12. }
  13. }

这就是Program.cs中的完整代码了。整理一下,就是我们常见的样子:

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateHostBuilder(args).Build().Run();
  6. }
  7. public static IHostBuilder CreateHostBuilder(string[] args) =>
  8. Host.CreateDefaultBuilder(args)
  9. .ConfigureWebHostDefaults(webBuilder =>
  10. {
  11. webBuilder.UseStartup<Startup>();
  12. });
  13. }

不过,到这儿还不能正常运行,因为Startup.cs现在还是空的。

3. 补齐Startup类

Startup类在Asp.net Core应用中有着重要的作用。这个类用于:

  • 使用DI容器注入服务
  • 设置Http Request管道以插入中间件

下面我们补齐所需的方法:

  1. namespace demo
  2. {
  3. public class Startup
  4. {
  5. public void ConfigureServices(IServiceCollection services)
  6. {
  7. }
  8. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  9. {
  10. }
  11. }
  12. }

运行,到这儿,Web应用已经可以正常启动了。

4. 给应用添加路由

Web应用启动了,但里面什么也没有,是空的。

要访问Web应用中的任何资源,需要配置路由。这儿的路由,基本上就是传入Http请求与资源之间的映射。

我们可以用下面的中间件来启动路由:

  • UseRouting
  • UseEndpoints

加一下试试:

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2. {
  3. app.UseRouting();
  4. app.UseEndpoints(endpoint => {
  5. endpoint.MapGet("/", async context =>
  6. {
  7. await context.Response.WriteAsync("Hello from Demo");
  8. });
  9. });
  10. }

这次运行,浏览器中就看到正确的输出了。

我们可以用MapGet映射更多资源:

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2. {
  3. app.UseRouting();
  4. app.UseEndpoints(endpoint =>
  5. {
  6. endpoint.MapGet("/", async context =>
  7. {
  8. await context.Response.WriteAsync("Hello from Demo");
  9. });
  10. endpoint.MapGet("/test", async context =>
  11. {
  12. await context.Response.WriteAsync("Hello from Demo.Test");
  13. });
  14. endpoint.MapGet("/about", async context =>
  15. {
  16. await context.Response.WriteAsync("Hello from Demo.About");
  17. });
  18. });
  19. }

到这儿,我们成功地把Console应用转为了Web应用。

三、延伸内容

上面完成的Web应用,算是Web应用中的基础。基于这个内容,我们还可以扩展到别的项目结构。

1. 改为MVC应用

需要在ConfigureServices 中注入AddControllersWithViews,并在Configure中添加MapDefaultControllerRoute

  1. public class Startup
  2. {
  3. public void ConfigureServices(IServiceCollection services)
  4. {
  5. services.AddControllersWithViews();
  6. }
  7. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  8. {
  9. app.UseRouting();
  10. app.UseEndpoints(endpoint =>
  11. {
  12. endpoint.MapDefaultControllerRoute();
  13. });
  14. }
  15. }

2. 改为WebAPI应用

需要注入AddControllersMapControllers

  1. public class Startup
  2. {
  3. public void ConfigureServices(IServiceCollection services)
  4. {
  5. services.AddControllers();
  6. }
  7. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  8. {
  9. app.UseRouting();
  10. app.UseEndpoints(endpoint =>
  11. {
  12. endpoint.MapControllers();
  13. });
  14. }
  15. }

3. 改为Razor应用

需要注入AddRazorPagesMapRazorPages

  1. public class Startup
  2. {
  3. public void ConfigureServices(IServiceCollection services)
  4. {
  5. services.AddRazorPages();
  6. }
  7. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  8. {
  9. app.UseRouting();
  10. app.UseEndpoints(endpoint =>
  11. {
  12. endpoint.MapRazorPages();
  13. });
  14. }
  15. }

四、总结

看下来,其实过程很简单。通过这种方式,能更进一步理解Dotnet Core的项目结构以及应用的运行过程。

希望对大家能有所帮助。

本文的配套代码在:https://github.com/humornif/Demo-Code/tree/master/0038/demo

微信公众号:老王Plus

扫描二维码,关注个人公众号,可以第一时间得到最新的个人文章和内容推送

本文版权归作者所有,转载请保留此声明和原文链接

深入浅出Dotnet Core的项目结构变化的更多相关文章

  1. Docker 部署Dotnet Core MVC项目

    原文:Docker 部署Dotnet Core MVC项目 1.dotnet core创建项目 dotnet new mvc -o myweb cd myweb 然后就是业务代码的编辑,增删改查乱七八 ...

  2. WSL2 新建dotnet core mvc项目

    我们知道dotnet sdk会有很多命令,但在我们完全不知道如何去使用哪个命令. 我们使用dotnet -h进行查看: 我们看到SDK的new命令,但是new命令又如何使用呢? 我们再次使用帮助: 可 ...

  3. 国产中标麒麟Linux部署dotnet core 环境并运行项目 (三) 部署运行WEB API项目

    部署dotnet Core Web API 上一步的文章,是我们公司最核心的一个ORM组件,在中标麒麟系统完成了一个插入数据的任务,这一步是将正式的从dot net framework 迁移到 dot ...

  4. DotNet Core 介绍

    前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...

  5. 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)

    背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...

  6. 在dotnet core web api中支持CORS(跨域访问)

    最近在写的Office add-in开发系列中,其中有一个比较共性的问题就是在add-in的客户端脚本中访问远程服务时,要特别注意跨域访问的问题. 关于CORS的一些基本知识,请参考维基百科的说明:h ...

  7. dotnet Core Asp.net 项目搭建

    Asp.Net Core 介绍 Asp.Net Core 目前最新版本 1.0.0-preview2-003131 Asp.Net Core官网:https://dotnet.github.io/ A ...

  8. 解决VS2015无法调试dotnet core项目

    dotnet core 1.0正式版和VS2015 update3安装后一直无法在VS中正常调试. 错误提示:The debugger's worker process (msvsmon.exe) u ...

  9. dotnet core 项目

    项目 常用命令 我们使用dotnet core 命令行来创建项目及进行编译,发布等,比较常用的dotnet core 命令 如下: dotnet new [arguments] [options] 创 ...

随机推荐

  1. 第二篇 Scrum 冲刺博客

    一.站立式会议 1. 会议照片 2. 工作汇报 成员名称 昨日(23日)完成的工作 今天(24日)计划完成的工作 工作中遇到的困难 陈锐基 - 完成个人资料编辑功能- 对接获取表白动态的接口数据并渲染 ...

  2. Codeforces Edu Round 47 A-E

    A. Game Shopping 按照题意模拟既可. #include <iostream> #include <cstdio> using namespace std; co ...

  3. CentOS配置Nginx官方的Yum源

    由于yum源中没有我们想要的nginx,那么我们就需要创建一个"/etc/yum.repos.d/nginx.repo"的文件,其实就是新增一个yum源. [root@niaoyu ...

  4. 简洁404页面源码 | 自适应404页面HTML好看的404源码下载

    description:源码 源码下载 源码网 源码自适应 源码图片 页面源码 页面源码下载 错误页源码 php源码 html源码 动漫 源码 演示图如下: HTML代码片段: 1 <!DOCT ...

  5. Docker(五):Docker安装Elasticsearch

    查找ElasticSearch镜像 镜像仓库 https://hub.docker.com/ 下拉镜像 docker pull elasticsearch:7.7.0 查看镜像 docker imag ...

  6. springmvc中使用文件上传功能

    项目代码:https://github.com/PeiranZhang/springmvc-fileupload Servlet3.0之前使用文件上传功能 Servlet3.0之前需要使用common ...

  7. 面试 02-CSS盒模型及BFC

    02-CSS盒模型及BFC #题目:谈一谈你对CSS盒模型的认识 专业的面试,一定会问 CSS 盒模型.对于这个题目,我们要回答一下几个方面: (1)基本概念:content.padding.marg ...

  8. react第十五单元(react路由的封装,以及路由数据的提取)

    第十五单元(react路由的封装,以及路由数据的提取) #课程目标 熟悉react路由组件及路由传参,封装路由组件能够处理路由表 对多级路由能够实现封装通用路由传递逻辑,实现多级路由的递归传参 对复杂 ...

  9. Flink批处理读取Hive写入MySql

    把hive 表stu77 的数据写入 mysql 表test_stu 中. 中间可以加自己的逻辑. import org.apache.flink.table.api.EnvironmentSetti ...

  10. pandas的学习3-设置值

    import pandas as pd import numpy as np # 我们可以根据自己的需求, 用 pandas 进行更改数据里面的值, 或者加上一些空的,或者有数值的列. # 首先建立了 ...