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


原文 | 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) 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM