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

【译】在 ASP.NET 和 ASP.NET Core 之间共享代码的更多相关文章

  1. 给外行或者刚入门普及一下关于C#,.NET Framework(.NET框架),.Net,CLR,ASP,ASP.Net, VS,以及.NET Core的概念

    一.概念 1. C# :C#是微软公司发布的一种面向对象的.运行于.NET Framework之上的高级程序设计语言. 2..NET Framework(.NET框架):.NET framework ...

  2. 比较ASP.NET和ASP.NET Core[经典 Asp.Net v和 Asp.Net Core (Asp.Net Core MVC)]

    ASP.NET Core是.与.Net Core FrameWork一起发布的ASP.NET 新版本,最初被称为ASP.NET vNext,有一系列的命名变化,ASP.NET 5.0,ASP.NET ...

  3. ASP.NET与ASP.NET Core用户验证Cookie并存解决方案

    在你将现有的用户登录(Sign In)站点从ASP.NET迁移至ASP.NET Core时,你将面临这样一个问题——如何让ASP.NET与ASP.NET Core用户验证Cookie并存,让ASP.N ...

  4. 简述关于ASP.NET MVC与.NET CORE 的区别

    简述关于ASP.NET MVC与.NET CORE的区别1.关于ASP.NET 关于MVC刚开始接触这个技术的时候我经常不理解他们的名字,我相信许多学ASP.NET开发人员开始接触MVC应该也和我一样 ...

  5. 从Asp .net到Asp core (第二篇)《Asp Core 的生命周期》

    前面一篇文章简单回顾了Asp .net的生命周期,也简单提到了Asp .net与Asp Core 的区别,我们说Asp Core不在使用Asp.netRuntime,所以它也没有了web程序生命周期中 ...

  6. 从Asp .net到Asp core (第一篇)《回顾Asp .net生命周期与管道机制》

    从2016年微软收购了Xamarin整合到Visual Studio里并将其开源到现在已有三年多时间,从.net core 1.0 到现在的2.2,以及即将问世的3.0,我们看到微软正在跨平台之路越走 ...

  7. 一、Linux平台部署ASP.NET、ASP.NET CORE、PHP

    一.什么是Jexus Jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关服务器,以支持ASP.NET.ASP.NET CORE.PHP为特色,同时具备反向代理.入侵检测等重要功能.可以 ...

  8. 用ASP创建API。NET Core (Day2):在ASP中创建API。网络核心

    下载PDF article - 1.5 MB 下载source - 152.4 KB 下载source - 206.3 KB 下载source code from GitHub 表的内容 中间件路线图 ...

  9. ASP.NET没有魔法——ASP.NET 身份验证与Identity

    前面的文章中为My Blog加入了文章的管理功能(ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块),但是管理功能应该只能由“作者”来访问,那么要如何控制用户的访问权限?也 ...

随机推荐

  1. sql中常用到的GUID

    在项目的数据库中经常见到如下所示的列: 列名:**_id 数据类型:UNIQUEIDENTIFIER 默认:NEWID() ROWGUIDCOL 属性. 其实这样的列通常为表的主键,函数NEWID() ...

  2. 笔记:Bridging the Gap Between Relevance Matching and Semantic Matching for Short Text Similarity Modeling

    笔记:Bridging the Gap Between Relevance Matching and Semantic Matching for Short Text Similarity Model ...

  3. django 验证和授权

    User模型 一. User模型简介 1. 是验证和授权框架的核心模型,完整路径为:django.contrib.auth.models.User 2. 模型中拥有的字段: 1. username:用 ...

  4. Linux配置 ElasticSearch

    一.什么是ElasticSearch? 一.什么是ES? ES是一个分布式使用RestFul风格的数据搜索引擎,并且ES是构建在Lucene框架之上,也就是说ES也是基于Lucene进行开发的搜索引擎 ...

  5. JavaCV的摄像头实战之六:保存为mp4文件(有声音)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. git merge -ff --no-ff --squash 的区别

    感谢原文作者:futureme 原文链接:https://www.cnblogs.com/taylorluo/articles/10810762.html git merge #没有参数(默认为–ff ...

  7. JVM学习十五 - (复习)类加载的时机、类加载过程、类加载器

    一.类加载的时机 类的生命周期 类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括以下 7 个阶段: 加载 验证 准备 解析 初始化 使用 卸载 验证.准备.解析 3 个阶段统称为连接 ...

  8. UIView与核心动画对比?

    1.UIView和核心动画区别?        核心动画只能添加到CALayer        核心动画一切都是假象,并不会改变真实的值.             2.什么时候使用UIView的动画? ...

  9. bom-简单动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. springboot实现分布式锁(spring integration,redis)

    Springboot实现分布式锁(Spring Integration+Redis) 一.在项目的pom.xml中添加相关依赖 1)Spring Integration依赖 <dependenc ...