從ASP.NET Core2.2到3.0你可能會遇到這些問題

原文: 從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的話,如今就能夠,若是是用在生產環境的話最好仍是等待正式版的發佈吧。

相關文章
相關標籤/搜索