深入浅出Dotnet Core的项目结构变化
有时候,越是基础的东西,越是有人不明白。
前几天Review一个项目的代码,发现非常基础的内容,也会有人理解出错。
今天,就着这个点,写一下Dotnet Core的主要类型的项目结构,以及之间的转换和演化。
一、最基础的应用Console
控制台应用,是Dotnet Core乃至前边的Dotnet Framework中,最基础的项目。
我们来创建一个Console项目看一下:
% dotnet new console -o demo
创建完成后,打开工程。工程里只有一个文件Program.cs
,里面只有一个方法Main
:
namespace demo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
在Dotnet Core所有类型的项目中,Program.cs
都是最开始的入口,main
方法,也是最开始的入口方法。
这个工程中,还有一个文件也需要了解一下,demo.csproj
,这是这个项目的定义文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</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
:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</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
:
class Program
{
static void Main(string[] args)
{
Host.CreateDefaultBuilder(args)
.Build()
.Run();
}
}
2. 配置Web主机
Web主机才是真正与Web相关的内容,主要实现:
- Http支持
- 设置Kestrol服务器为Web服务器
- 添加IIS支持
加入Web主机,也是一个方法ConfigureWebHostDefaults
:
class Program
{
static void Main(string[] args)
{
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
})
.Build()
.Run();
}
}
这个方法用来添加Http请求管道并注入我们需要的服务。而注入我们需要的服务,就是我们最常见的Startup.cs
的内容。
下面,我们先创建Startup.cs
,
namespace demo
{
public class Startup
{
}
}
在前边ConfigureWebHostDefaults
中,加入Startup
,并补齐代码:
class Program
{
static void Main(string[] args)
{
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.Build()
.Run();
}
}
这就是Program.cs
中的完整代码了。整理一下,就是我们常见的样子:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
不过,到这儿还不能正常运行,因为Startup.cs
现在还是空的。
3. 补齐Startup类
Startup
类在Asp.net Core应用中有着重要的作用。这个类用于:
- 使用DI容器注入服务
- 设置Http Request管道以插入中间件
下面我们补齐所需的方法:
namespace demo
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}
}
运行,到这儿,Web应用已经可以正常启动了。
4. 给应用添加路由
Web应用启动了,但里面什么也没有,是空的。
要访问Web应用中的任何资源,需要配置路由。这儿的路由,基本上就是传入Http请求与资源之间的映射。
我们可以用下面的中间件来启动路由:
- UseRouting
- UseEndpoints
加一下试试:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoint => {
endpoint.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello from Demo");
});
});
}
这次运行,浏览器中就看到正确的输出了。
我们可以用MapGet
映射更多资源:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoint =>
{
endpoint.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello from Demo");
});
endpoint.MapGet("/test", async context =>
{
await context.Response.WriteAsync("Hello from Demo.Test");
});
endpoint.MapGet("/about", async context =>
{
await context.Response.WriteAsync("Hello from Demo.About");
});
});
}
到这儿,我们成功地把Console应用转为了Web应用。
三、延伸内容
上面完成的Web应用,算是Web应用中的基础。基于这个内容,我们还可以扩展到别的项目结构。
1. 改为MVC应用
需要在ConfigureServices
中注入AddControllersWithViews
,并在Configure
中添加MapDefaultControllerRoute
:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoint =>
{
endpoint.MapDefaultControllerRoute();
});
}
}
2. 改为WebAPI应用
需要注入AddControllers
和MapControllers
:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoint =>
{
endpoint.MapControllers();
});
}
}
3. 改为Razor应用
需要注入AddRazorPages
和MapRazorPages
:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoint =>
{
endpoint.MapRazorPages();
});
}
}
四、总结
看下来,其实过程很简单。通过这种方式,能更进一步理解Dotnet Core的项目结构以及应用的运行过程。
希望对大家能有所帮助。
本文的配套代码在:https://github.com/humornif/Demo-Code/tree/master/0038/demo
![]() |
微信公众号:老王Plus 扫描二维码,关注个人公众号,可以第一时间得到最新的个人文章和内容推送 本文版权归作者所有,转载请保留此声明和原文链接 |
深入浅出Dotnet Core的项目结构变化的更多相关文章
- Docker 部署Dotnet Core MVC项目
原文:Docker 部署Dotnet Core MVC项目 1.dotnet core创建项目 dotnet new mvc -o myweb cd myweb 然后就是业务代码的编辑,增删改查乱七八 ...
- WSL2 新建dotnet core mvc项目
我们知道dotnet sdk会有很多命令,但在我们完全不知道如何去使用哪个命令. 我们使用dotnet -h进行查看: 我们看到SDK的new命令,但是new命令又如何使用呢? 我们再次使用帮助: 可 ...
- 国产中标麒麟Linux部署dotnet core 环境并运行项目 (三) 部署运行WEB API项目
部署dotnet Core Web API 上一步的文章,是我们公司最核心的一个ORM组件,在中标麒麟系统完成了一个插入数据的任务,这一步是将正式的从dot net framework 迁移到 dot ...
- DotNet Core 介绍
前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...
- 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)
背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...
- 在dotnet core web api中支持CORS(跨域访问)
最近在写的Office add-in开发系列中,其中有一个比较共性的问题就是在add-in的客户端脚本中访问远程服务时,要特别注意跨域访问的问题. 关于CORS的一些基本知识,请参考维基百科的说明:h ...
- dotnet Core Asp.net 项目搭建
Asp.Net Core 介绍 Asp.Net Core 目前最新版本 1.0.0-preview2-003131 Asp.Net Core官网:https://dotnet.github.io/ A ...
- 解决VS2015无法调试dotnet core项目
dotnet core 1.0正式版和VS2015 update3安装后一直无法在VS中正常调试. 错误提示:The debugger's worker process (msvsmon.exe) u ...
- dotnet core 项目
项目 常用命令 我们使用dotnet core 命令行来创建项目及进行编译,发布等,比较常用的dotnet core 命令 如下: dotnet new [arguments] [options] 创 ...
随机推荐
- 20192313 实验一《Linux基础与Java开发环境》实验报告
20192313 2020-10-8 <数据结构与面向对象程序设计>实验1报告 课程:<程序设计与数据结构> 班级: 1923 姓名: 陈宇帆 学号:20192313 实验教师 ...
- Linux文件权限问题
更改权限命令 chmod 常用参数 -R, --recursive change files and directories recursively (以递归的方式对目前目录下的所有档案与子目录进 ...
- SpringBoot 拦截器和自定义注解判断请求是否合法
应用场景举例: 当不同身份的用户请求一个接口时,用来校验用户某些身份,这样可以对单个字段数据进行精确权限控制,具体看代码注释 自定义注解 /** * 对比请求的用户身份是否符合 * @author l ...
- Linux(CentOS7)安装Nginx(附简单配置)
1. 安装make yum -y install gcc automake autoconf libtool make 2. 安装gcc yum -y install gcc gcc-c++ 3. 安 ...
- jmeter__问题记录,中文乱码问题(json参数化)
这种情况在jmeter3.0的版本中才会产生,注意:这不是乱码,而是由于3.0中优化body data后,使用默认的字体(Consolas)不支持汉字的显示.这样的情况可以这样调整:进入jmeter. ...
- mysql-zerofill关键字
zerofill位数填充 mysql> create table shop( -> article int(4) unsigned zerofill default '0000' not ...
- css进阶 07-CSS面试题
07-CSS面试题 #常见问题 #你是如何理解 HTML 语义化的? 语义化:指对文本内容的结构化(内容语义化),选择合乎语义的标签(代码语义化). 举例:段落用 p,边栏用 aside,主要内容用 ...
- day020|python之面向对象基础2
面向对象基础2 目录 面向对象基础2 7 对象与类型 7.1 类即类型 7.1.1 变量的三个指标 7.1.2 变量类型 7.2 list.append()方法原理 8 对象的高度整合 8.1 通过面 ...
- matlab中fminbnd函数求最小或者组大值
clc; clear all; close all; fx = @(x) -(0.4./sqrt(1 + x.^2) - sqrt(1+x.^2) .* (1- 0.4./(1 + x.^2))+x) ...
- 每天学习一点ES6(二)let 和 const
let 命令 let 和 var 差不多,只是限制了有效范围. 先定义后使用 不管是什么编程语言,不管语法是否允许,都要秉承先定义,然后再使用的习惯,这样不会出幺蛾子.以前JavaScript比较随意 ...