原文 | 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 文件並添加一些更改,因為這些文件非常易讀。
要開始共享控制器類,您需要創建一個
<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 文件添加另一個
這是一個示例,展示了如何修改 [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) 。