在ASP.NET和ASP.NET Core之间共享代码教程

在ASP.NET和ASP.NET Core之间共享代码教程

随着.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的功能之间轻松切换。

给TA打赏
共{{data.count}}人
人已打赏
.NET

宣布为 .NET 推出 gRPC JSON 转码

2022-8-22 16:37:01

.NET

第7章 数据绑定控件(一)

2022-8-23 11:04:03

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索