从ASP.NET Core2.2到3.0你可能会遇到这些问题

趁着假期的时间因此想从新学习下微软的官方文档来巩固下基础知识。咱们都知道微软目前已经发布了.NET Core3.0的第三个预览版,同时我家里的电脑也安装了vs2019。So,就用vs2019+.NET Core3.0来跟着作一下Contoso University这个WEB应用,可是在基于3.0进行操做的时候遇到了一些问题,因此我就查看了微软的《从 ASP.NET Core 迁移 2.2 到 3.0 预览版 2》这篇文档,就着今天遇到的问题,因此我整理下,但愿对大伙有所帮助,固然大伙也能够直接阅读微软的官方文档进行查看。可是我在阅读官方说明的时候,总感受翻译的不是很准确,读起来很拗口,因此这里我是本身的理解对官方文档的一个补充。html

做者:依乐祝
原文连接:http://www.javashuo.com/article/p-atynewiy-kn.htmlgit

我遇到的问题

ASP.NET Core2.0时代,若要为项目添加 EF Core 支持,须要安装相应的数据库驱动包。 教程中使用 SQL Server,相关驱动包Microsoft.EntityFrameworkCore.SqlServer。 此包包含在 Microsoft.AspNetCore.App 元包中,所以,若是应用具备对 Microsoft.AspNetCore.App 包的包引用,则无需引用该包。而2.0中的模板项目会自动为咱们加载Mcrosoft.AspNetCore.App这个包的。可是3.0中没有了这个Mcrosoft.AspNetCore.App这个包,模块化的更完全了!所须要的EF相关的包须要你本身来进行引用。github

2.0升3.0升级指南

就着今天遇到的问题,因此我整理下ASP.NET Core从2.0升级3.0的一个升级指南,但愿对大伙有所帮助,固然大伙也能够直接阅读微软的官方文档进行查看。可是我在阅读官方说明的时候,总感受翻译的不是很准确,读起来很拗口,因此这里我是本身的理解对官方文档的一个补充。web

更新项目文件

  • 设置TargetFrameworknetcoreapp3.0:数据库

    <TargetFramework>netcoreapp3.0</TargetFramework>
  • 删除Microsoft.AspNetCore.AllMicrosoft.AspNetCore.App元包的任何<PackageReference>json

  • <PackageReference>元素中剩余的Microsoft.AspNetCore.*程序包更新到当前的预览版中 (例如,3.0.0-preview3.19128.7)。api

    若是没有对应的 3.0 版本的包,则说明包可能会在 3.0 中弃用。 其中许多以前都属于Microsoft.AspNetCore.App而且不须要单独引用的包,如上面我遇到的问题,关于SQL Server的EF相关的包。 具体的再也不在 3.0 中生成的包的列表,请参阅aspnet/AspNetCore #3756服务器

  • 某些程序集已从2.x和3.0之间的Microsoft.aspnetcore.app中删除。若是您正在使用aspnet/AspNetCore #3755中列出的包中的API,则可能须要单独添加到 mvc

    例如,Microsoft.EntityFrameworkCoreSystem.Data.SqlClient再也不属于Microsoft.AspNetCore.App得一部分。 Microsoft.aspnetcore.app中的程序集列表还没有定稿,将在3.0 RTM以前更改。app

  • 添加Json.NET 支持

  • 项目默认为 ASP.NET Core 3.0 或更高版本设置为进程内承载模型。 固然,若是其值为InProcess您还能够经过删除<AspNetCoreHostingModel>元素,来进行修改。

Json.NET 支持

做为提升 ASP.NET Core 共享的框架工做的一部分, Json.NET已从 ASP.NET Core 共享框架中删除。

若要在 ASP.NET Core 3.0 项目中使用 Json.NET:

Newtonsoft 的个性化设置能够设置为AddNewtonsoftJson:

services.AddMvc()
    .AddNewtonsoftJson(options =>
           options.SerializerSettings.ContractResolver =
              new CamelCasePropertyNamesContractResolver());

HostBuilder 替换 WebHostBuilder

使用 ASP.NET Core 3.0 模板泛型宿主。 早期版本使用Web 主机。 下面的代码显示了生成 ASP.NET Core 3.0 模板Program类:

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>();
            });
}

下面的代码演示模板生成 ASP.NET Core 2.2Program类:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

IWebHostBuilder 将保留在 3.0,是一种webBuilder上面的代码示例所示。 WebHostBuilder 将在将来版本中弃用并替换为HostBuilder

WebHostBuilderHostBuilder最显著的变化是依赖关系注入 (DI)。 使用时HostBuilder,只能将IConfigurationIHostingEnvironment注入到Startup的构造函数中。 HostBuilder DI 约束:

  • 使DI容器只能构建一次。
  • 避免产生的对象生存期问题,例如解决多个单例实例。

更新 SignalR 代码

若是您调用AddJsonProtocol,将其替换为AddNewtonsoftJsonProtocol

  • 如下示例显示更改先后的服务器代码:

    services.AddSignalR(...)
            .AddJsonProtocol(...) // 2.2
    services.AddSignalR(...)
            .AddNewtonsoftJsonProtocol(...) // 3.0
  • 如下示例显示更改先后的.NET客户端代码:

    connection = new HubConnectionBuilder()
        .WithUrl(...)
        .AddJsonProtocol(...) // 2.2
        .Build()
    connection = new HubConnectionBuilder()
        .WithUrl(...)
        .AddNewtonsoftJsonProtocol(...) // 3.0
        .Build()

选择启用运行时编译

在 3.0 中,运行时编译是可选的方案。 若要启用运行时编译,请参阅ASP.NET Core 中的 Razor 文件编译

总结

感受微软在努力实现ASP.NET Core的模块化,减少各类依赖,让包变得更小。同时ASP.NET Core也已经很完善了,大伙是时候用起来ASP.NET Core了。另外须要说明的一点是,大伙若是是为了体验ASP.NET Core3.0的话,如今就能够,若是是用在生产环境的话最好仍是等待正式版的发布吧。

相关文章
相关标签/搜索