【譯】在 ASP.NET 和 ASP.NET Core 之間共享程式碼

MingsonZheng發表於2022-03-04

原文 | Ken

翻譯 | 鄭子銘

隨著 .NET 6 的釋出,使用 ASP.NET Core 可以獲得更多好處。但是將現有程式碼遷移到 ASP.NET Core 通常聽起來像是一項巨大的投資。今天我們將分享如何加速向 ASP.NET Core 的遷移。您今天可以進行一些細微的更改,以便明天更輕鬆地遷移到 ASP.NET Core。

在我們開始之前,讓我們先談談一個真實的場景。讓我們談談如何修改一個有 10 年曆史的應用程式中的程式碼,以便它可以與 ASP.NET Core 共享。在接下來的部分中,我們將提供從用於演示 ASP.NET MVC3 的 MVC 音樂商店應用程式遷移 ShoppingCartController.cs 的示例。

遷移此 Web 應用的第一步是建立一個新的 ASP.NET Core Web 應用(模型-檢視-控制器)專案。此模板將新增對控制器的支援,並在 Program.cs 檔案中對映控制器的預設路由。一旦我們有了新的專案設定,我們將刪除預設的 HomeController 以及 Home/Index 和 Home/Privacy 的檢視檔案,以便我們可以從 MVC3 Music Store Web 應用程式共享內容而不會發生衝突。

您可以共享控制器

您可以在兩個專案之間共享的第一件事是控制器。許多團隊希望新網站與當前網站一樣工作。當我們說“相同”時,我們的意思是“相同”。如果您修復了一個專案中的錯誤,那麼您需要相同的修復程式出現在兩個站點中。確保這種行為的最簡單方法之一是在兩個專案中共享同一個檔案。幸運的是 ASP.NET Core 使用了新的 SDK 風格的專案檔案。這意味著很容易開啟 csproj 檔案並新增一些更改,因為這些檔案非常易讀。

要開始共享控制器類,您需要建立一個 並新增對現有類的引用。這是一個示例,展示瞭如何通過更新 ASP.NET Core 專案的 csproj 檔案來共享 ShoppingCartController.cs。

    <ItemGroup>
        <Compile Include="..MvcMusicStoreControllersShoppingCartController.cs" LinkBase="Controllers" />
    </ItemGroup>

好的,現在該檔案已包含在專案中,但您可能已經猜到 ASP.NET Core 專案不再編譯了。在 ASP.NET Core 中,Controller 類不使用 System.Web.Mvc,而是使用 Microsoft.AspNetCore.Mvc。

下面的示例展示了 ShoppingCartController.cs 如何使用這兩個名稱空間來修復該編譯器錯誤。

#if NET
using Microsoft.AspNetCore.Mvc;
#else
using System.Web.Mvc;
#endif

ShoppingCartController 中還有其他地方需要更新,但方法是相同的。使用 C# 前處理器指令,我們可以使類足夠靈活,可以為兩個專案進行編譯。

對於有大量程式碼對 ASP.NET Core 工作方式不同的場景,您可能需要建立特定於實現的檔案。一個好的方法是建立一個部分類並將這些程式碼塊提取到兩個 Web 應用程式目標之間不同的新方法中,並使用 csproj 來控制在構建專案時包含哪些檔案。

您可以共享模型

現在我們可以共享控制器,我們想要共享它們返回的模型。在許多情況下,當我們通過向 csproj 檔案新增另一個 來包含它們時,這才開始起作用。但是,如果您的模型也引用 System.Web,那麼我們可以使用剛剛用於控制器的相同方法。首先更新名稱空間,以便相同的類檔案可以存在於兩個專案中。繼續使用 C# 預編譯器指令來新增 ASP.NET Core 支援。

這是一個示例,展示瞭如何修改 [Bind] 屬性。

#if !NET
    [Bind(Exclude="OrderId")]
#endif
    public partial class Order
    {
        [ScaffoldColumn(false)]
#if NET
    [BindNever]
#endif
        publicintOrderId{ get; set; }
   …
   …

您可以共享檢視

我們甚至可以共享檢視。再次使用相同的方法,我們可以編輯 csproj 檔案以共享檔案,如 _Layout.cshtml。而且,在檢視內部,您可以繼續使用 C# 預編譯器指令來使檔案足夠靈活以供兩個專案使用。

下面是一個母版頁,它混合支援來自 ASP.NET 的子操作和來自 ASP.NET Core 的檢視元件,這樣我們就可以渲染已知購物車中有多少商品的頁面部分。

@{
    #if NET
        <text>@awaitComponent.InvokeAsync("CartSummary")</text>
    #else
        @Html.RenderAction("CartSummary", "ShoppingCart");
    #endif
}

打包

共享程式碼的能力還包括 CSS、JavaScript 和影像等靜態內容。現在,您可以逐步在您的 Web 應用程式中構建靈活性,以使您更輕鬆地遷移到 ASP.NET Core。

如果您想要更詳細的指導來遷移整個 ShoppingCartController.cs,您可以在 MvcMusicStoreMigration 上使用示例進行完整的演練。該演練還將演示如何從同一個 IIS 應用程式池執行 ASP.NET 和 ASP.NET Core,以一次增量地遷移 Web 應用程式一個控制器。

對於那些計劃開始進行 ASP.NET Core 遷移的人,我們將分享一些更多技巧。

  • 升級您的 NuGet 包,以便您可以使用 netstandard。
  • 將您的類庫更改為 netstandard,以便您可以在 ASP.NET 和 ASP.NET Core 之間共享程式碼。
  • 在您的類庫構建介面中查詢對 System.Web 的引用替換它們。使用依賴注入,以便您可以輕鬆地在 ASP.NET 和 ASP.NET Core 功能之間切換。

您還可以在從 ASP.NET 遷移到 ASP.NET Core 的文件中找到更多指導。

原文連結

Sharing code between ASP.NET and ASP.NET Core

知識共享許可協議

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。

歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。

如有任何疑問,請與我聯絡 (MingsonZheng@outlook.com) 。

相關文章