.NetCore 项目从2.1升级到3.1过程中的实战,简单整理记录下
1.TargetFramework 升级
这步比较简单,站点,类库修改下版本。
<TargetFramework>netcoreapp2.1</TargetFramework>
由原来的2.1-》3.1
2.替换掉旧的属性
2.1 | 3.1 |
---|---|
IHostingEnvironment | IWebHostEnvironment |
services.AddMvc() | services.AddControllersWithViews() |
等等....
3.不生成 *.Views.dll 处理
.NET core 默认会把.Cshtml文件生成对应的dll,如果只修改页面信息,还需要重新编译,不太方便!以下方式发布,可以在发布的时候不生成*.Views.dll
2.1方式
- 编辑项目.csproj 新增<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish> 如下
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>
3.1方式
- 安装包: Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
- 更新项目的 Startup.ConfigureServices 方法 添加 mvcBuilder.AddRazorRuntimeCompilation();
- 编辑项目.csproj 新增 <RazorCompileOnPublish>false</RazorCompileOnPublish> 如下
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RazorCompileOnPublish>false</RazorCompileOnPublish>
</PropertyGroup>
4.NetCore 类库引用问题
我原来的.NetCore类库升级之后结果发生错误 如图
按照以往的经验,报错按照提示解决就是了
以为缺少对应的包,然后去nuget安装时发现 最新版本是2.2 ,跟.NETcore web 项目引用的版本不一样。
查看了官网说明之后,知道问题所在。
面向 Microsoft.NET.Sdk.Web SDK 的项目隐式引用 Microsoft.AspNetCore.App 框架。
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
...
</Project>
面向 Microsoft.NET.Sdk 或 Microsoft.NET.Sdk.Razor SDK 的项目 如果需要,只能手工添加Microsoft.AspNetCore.App
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
...
</Project>
到此.NetCore 类库,可以正确的使用Microsoft.AspNetCore.App。那这两个共享框架的区别在哪里呢?
框架名称 | 描述 |
---|---|
Microsoft.NETCore.App | 基本运行时. 它支持 System.Object, List<T>, string, memory management(内存管理), file(文件) and network IO(网络io), threading(线程), etc. |
Microsoft.AspNetCore.App | 默认的Web运行时. 他导入 Microsoft.NETCore.App, 并添加api以使用Kestrel创建HTTP server, Mvc, SignalR, Razor, and EF Core 部分 |
5.NETcore3.1 集成Autofac方式变动
在创建主机时添加AutofacServiceProviderFactory
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
在startup.cs添加ConfigureContainer方法,然后可以使用ContainerBuilder用来访问autofac容器,并注入。
public void ConfigureContainer(ContainerBuilder builder)
{
}