歡迎光臨
每天分享高質量文章

從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》這篇文件,希望對大伙有所幫助。

作者:依樂祝
原文鏈接:https://www.cnblogs.com/yilezhu/p/10661161.html

我遇到的問題

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相關的包需要你自己來進行取用。

2.0升3.0升級指南

就著今天遇到的問題,所以我整理下ASP.NET Core從2.0升級3.0的一個升級指南,希望對大伙有所幫助,當然大伙也可以直接閱讀微軟的官方文件進行查看。但是我在閱讀官方說明的時候,總感覺翻譯的不是很準確,讀起來很拗口,所以這裡我是自己的理解對官方文件的一個補充。

更新專案檔案

  • 設置TargetFramework到netcoreapp3.0:

    <TargetFramework>netcoreapp3.0TargetFramework>
  • 刪除Microsoft.AspNetCore.All或Microsoft.AspNetCore.App元包的任何

  • 元素中剩餘的Microsoft.AspNetCore.*程式包更新到當前的預覽版中 (例如,3.0.0-preview3.19128.7)。

    如果沒有對應的 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,則可能需要單獨添加到。

    例如,Microsoft.EntityFrameworkCoreSystem.Data.SqlClient不再屬於Microsoft.AspNetCore.App得一部分。 Microsoft.aspnetcore.app中的程式集串列尚未定稿,將在3.0 RTM之前更改。

  • 添加Json.NET 支持。

  • 專案預設為 ASP.NET Core 3.0 或更高版本設置為行程內承載模型。 當然,如果其值為InProcess您還可以通過刪除元素,來進行修改。

Json.NET 支持

作為提高 ASP.NET Core 共享的框架工作的一部分, Json.NET已從 ASP.NET Core 共享框架中刪除。

若要在 ASP.NET Core 3.0 專案中使用 Json.NET:

  • 添加到包取用Microsoft.AspNetCore.Mvc.NewtonsoftJson

  • 更新ConfigureServices呼叫AddNewtonsoftJson()

    services.AddMvc()
        .AddNewtonsoftJson();

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

下麵的代碼演示模板生成 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();
}

IWebHostBuilder 將保留在 3.0,是一種webBuilder上面的代碼示例所示。 WebHostBuilder 將在未來版本中棄用並替換為HostBuilder

WebHostBuilderHostBuilder最顯著的變化是依賴關係註入 (DI)。 使用時HostBuilder,只能將IConfiguration並IHostingEnvironment註入到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的話,現在就可以,如果是用在生產環境的話最好還是等待正式版的發佈吧。

    赞(0)

    分享創造快樂