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

前几天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应用

需要注入AddControllersMapControllers

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应用

需要注入AddRazorPagesMapRazorPages

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的项目结构变化的更多相关文章

  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. MySQL技术内幕InnoDB存储引擎(三)——文件相关

    构成MySQL数据库和InnoDB存储引擎表的文件类型有: 参数文件:MySQL实例运行时需要的参数就是存储在这里. 日志文件:用来记录MySQL实例对某种条件做出响应时写入的文件. socket文件 ...

  2. Python3中zipfile模块文件名乱码问题

    inux下zip文件乱码已经是一个常见问题了,再加上python想不遇到乱码问题都难. 在zipfile.ZipFile中获得的filename有中日文则很大可能是乱码,这是因为 在zip标准中,对文 ...

  3. PHP判断字符串所属编码:ASCII、GB2312、GBK、UTF-8、ISO-8859-1

    ASCII: ASCII的编码范围为0-127(十六进制:0x00-0x7F),判断函数: function isasciistr($str){ for($i=0;$i<strlen($str) ...

  4. oracle 11g修改归档日志目录及大小

    1.查看当前归档日志目录 SQL> show parameter recovery NAME TYPE VALUE ------------------------------------ -- ...

  5. 第一篇:docker 简单入门(一)

    本篇目录 写在最前面的话 docker概念介绍 镜像的概念.容器的概念 docker的安装介绍 写在最前面的话 由于此类文章博客园鉴定为简单文章,所以已经移到csdn[https://blog.csd ...

  6. 网站配置Gittalk教程和解决gittalk的Error: Not Found.问题

    想把网站增加gittalk的评论功能,按照其他教程配置后,出现了 Error: Not Found. 的错误.截图如下: 网上找了很多解决方案,现在贴出来完整的配置Gittalk的教程. 01.新建评 ...

  7. [日常摸鱼]Luogu1801 黑匣子(NOI导刊)

    题意:写一个数据结构,要求滋兹两种操作,ADD:插入一个数,GET:令$i++$然后输出第$i$小的数 这个数据结构当然是平衡树啦!(雾) 写个Treap直接过掉啦- #include<cstd ...

  8. go-slice实现的使用和基本原理

    目录 摘要 Slice数据结构 使用make创建Slice 使用数组创建Slice Slice 扩容 Slice Copy 特殊切片 总结 参考 你的鼓励也是我创作的动力 Posted by 微博@Y ...

  9. [EF] - 动态创建模型:System.Reflection.Emit + Code First

    动态创建Entity Framework模型并且创建数据库 使用System.Reflection.Emit+Code First model创建以下的一个实体类和DbContext并且创建数据库: ...

  10. 前端技术VUE 的前世今生从PC 走向移动

    一.Vue的前世 Vue 框架诞生于2014年,他的作者为中国人–尤雨溪(江苏无锡人).Vue用于构建交互式的Web界面的库,是一个构建数据驱动的Web界面渐进式框架,该框架遵循CMD规范,并且提供的 ...