День 1141. #ЗаметкиНаПолях
Совместное Использование Кода Между ASP.NET и ASP.NET Core
Перенос существующего кода в ASP.NET Core часто кажется серьёзным шагом. Однако уже сегодня можно внести небольшие изменения, которые упростят переход на ASP.NET Core завтра.
Первым шагом является создание нового проекта ASP.NET Core Web App (Model-View-Controller). Этот шаблон добавит поддержку контроллеров и сопоставит маршрут по умолчанию для контроллеров в файле Program.cs. После этого можно удалить созданные по умолчанию контроллер HomeController и представления Home/Index и Home/Privacy.
Контроллеры
Многие команды хотят, чтобы новый веб-сайт работал так же, как текущий. Если вы исправляете ошибку в проекте, важно, чтобы это исправление отображалось на обоих сайтах. Один из самых простых способов обеспечить это — предоставить общий доступ к одному и тому же файлу в обоих проектах. К счастью, ASP.NET Core использует новые файлы проектов в стиле SDK. Это означает, что файл csproj легко открыть и внести некоторые изменения. Нужно создать <ItemGroup> и добавить ссылку на существующий класс:
<ItemGroup>
<Compile
Include="..HomeController.cs"
LinkBase="Controllers" />
</ItemGroup>
Теперь проект ASP.NET Core больше не компилируется. В ASP.NET Core класс Controller использует не System.Web.Mvc, а Microsoft.AspNetCore.Mvc. Это можно исправить с помощью директив препроцессора:
#if NET
using Microsoft.AspNetCore.Mvc;
#else
using System.Web.Mvc;
#endif
Аналогичный код можно добавить и в других нужных местах, чтобы заставить оба проекта компилироваться. Кроме того, можно создать частичные классы и выделить крупные блоки кода в новые методы, различающиеся в разных проектах, а затем, используя csproj, включать в проект только нужные файлы.
Модели
Для этого подойдут те же советы, что и при совместном использовании контроллеров. Также директивы препроцессора можно использовать для атрибутов:
#if !NET
[Bind(Exclude="Id")]
#endif
public partial class Order
{
[ScaffoldColumn(false)]
#if NET
[BindNever]
#endif
public int Id { get; set; }
…
Представления
Опять же можно использовать csproj для совместного использования файлов, таких как _Layout.cshtml. Внутри представления вы можете продолжать использовать директивы препроцессора:
@{
#if NET
<text>
@await
Component.InvokeAsync("CartSummary")
</text>
#else
@Html.RenderAction(
"CartSummary",
"ShoppingCart");
#endif
}
Аналогично можно совместно использовать статический контент (CSS, JavaScript и изображения). Также обновите все NuGet-пакеты и ваши собственные библиотеки под использование netstandard, чтобы они могли совместно использоваться в обоих проектах.
Пошаговые инструкции по переносу на примере проекта MvcMusicStore приведены здесь. Там также описано, как можно запускать ASP.NET и ASP.NET Core из одного и того же пула приложений IIS для постепенной миграции вашего веб-приложения по одному контроллеру за раз.
Источник: devblogs.microsoft.com/dotnet/…pnetcore