随着.NET 6的发布,使用ASP.NET Core有更多好处。但是,将现有的代码迁移到ASP.NET Core上往往听起来是一个很大的投资。今天我们将分享如何加速迁移到ASP.NET Core。今天你可以做一些小的改动,这些改动可以使你明天更容易迁移到ASP.NET Core。
在我们开始之前,让我们谈一谈一个真实的场景。让我们来谈谈如何修改一个有10年历史的应用程序的代码,使其能够与ASP.NET Core共享。在接下来的章节中,我们将给出迁移MVC音乐商店应用中ShoppingCartController.cs
的示例,该应用被用来演示ASP.NET MVC3。
迁移这个Web应用的第一步是创建一个新的**ASP.NET Core Web应用(模型-视图-控制器)**项目。这个模板将添加对控制器的支持,并在Program.cs
文件中为控制器映射默认路由。一旦我们设置好新项目,我们将删除默认的HomeController
,以及Home/Index
和Home/Privacy
的视图文件,这样我们就可以从MVC3音乐商店网络应用中分享内容而不发生冲突。
你可以共享控制器
你可以在两个项目之间共享的第一件事是控制器。许多团队希望新网站的工作方式与当前网站相同。当我们说 "相同 "时,我们是指 "相同"。如果你在一个项目中修复了一个错误,那么你需要在两个网站上都显示出同样的修复。保证这种行为的最简单的方法之一是在两个项目中共享相同的文件。幸运的是,ASP.NET核心使用新的SDK风格的项目文件。这意味着很容易打开csproj文件并添加一些修改,因为这些文件是非常可读的。
要开始共享一个控制器类,你需要创建一个<ItemGroup>
,并添加一个对现有类的引用。这里有一个例子,展示了如何通过更新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文件中添加另一个<ItemGroup>
,这将开始工作。但是如果你的模型也引用了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的Child Actions和ASP.NET Core的View Components,这样我们就可以渲染页面的一部分,知道购物车里有多少物品。
@{
#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的功能之间轻松切换。