Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Янгиров Эмиль "Переход с .net framework на .net...

DotNetRu
August 13, 2019

Янгиров Эмиль "Переход с .net framework на .net core. Tips and tricks"

Эмиль перевел несколько проектов с .Net Framework на .Net core и собрал инструкцию по поэтапному переходу. Заодно расскажет о несовместимостях и подводных камнях, с которыми столкнулся сам.

DotNetRu

August 13, 2019
Tweet

More Decks by DotNetRu

Other Decks in Programming

Transcript

  1. .NET Framework → .NET Core Tips & Tricks Янгиров Эмиль,

    ООО “Комтек” yangirov emil_yangirov 1
  2. План • описание проекта • причины миграции и ее преимущества

    • подходы к миграции • как получилось у нас 2
  3. Общие сведения о проекте Платформа телемедицины • консультации “врач-врач” •

    направления на “тяжелое” медицинское оборудование • запись на прием • регистр пациентов • аналитика, отчёты C# - 125763 (cloc), IIS. 3
  4. Преимущества миграции • поддержка нескольких платформ • использование контейнеров •

    ускорение рантайма • упрощение деплоя • экономия на инфраструктуре 4
  5. Структура проекта Site API Integration API DAL TrueConf Services DaData

    ЕСИА ИЭМК ... Utils Tests ... Интеграции API Бизнес-логика, данные, утилиты 5
  6. Одновременный переход + универсальный способ + рекомендуется Microsoft - требует

    больших временных затрат единоразово https://docs.microsoft.com/ru-ru/dotnet/core/porting 8
  7. Постепенный переход + не останавливает разработку + разбит на кучу

    мелких задач - не подходит при сжатых сроках 9
  8. Ликвидация зависимостей, не поддерживающих .NET Core 18 удалить пакет найти

    миграцию от автора или форк найти аналог, переписать функционал
  9. Ликвидация зависимостей, не поддерживающих .NET Core 22 удалить пакет найти

    миграцию от автора или форк .NET Framework compatibility mode найти аналог, переписать функционал ⚠ опасно использовать Windows Compatibility Pack
  10. Ликвидация зависимостей, не поддерживающих .NET Core Windows Compatibility Pack Включает

    в себя около 20 000 API, в том числе только для Windows: Windows EventLog Configuration Windows Management Instrumentation (WMI) Directory Services Windows Performance Counters ODBC Windows Registry Windows Access Control Lists (ACL) Windows Cryptography Windows Communication Foundation (WCF) Windows Services Windows Runtime Caching https://docs.microsoft.com/en-us/dotnet/core/porting/windows-compat-pack 23
  11. Изучение связей между проектами Начали с перевода утилитарных проектов на

    .NET Standard • подходит для “пробы пера” • изолирован • используется везде • почти нет сторонних зависимостей 24
  12. Подготовительный этап Чек-лист ✓ определить подход к миграции ✓ собрать

    информацию о возможности перехода ✓ обновить зависимости ✓ изучить связи между проектами 25
  13. 26

  14. Миграция первого проекта Если утилитарный проект получилось перевести на .NET

    Standard без проблем, можно приступать к основной миграции. Т.к. используется .NET Standard все остальные проекты не сломаны. 29
  15. packages.config → PackageReference Для старых проектов Для новых проектов •

    CsprojToVs2017 (всё разом) • Visual Studio 2019 (по одному) ✌ 30
  16. CsprojToVs2017 (всё разом) Установить пакет dotnet tool install --global Project2015To2017.Migrate2019.Tool

    Запустить миграцию dotnet migrate-2019 wizard "D:\Path\To\My\Project.csproj" https://github.com/hvanbakel/CsprojToVs2017 31
  17. packages.config → PackageReference Для старых проектов Для новых проектов •

    CsprojToVs2017 (всё разом) • Visual Studio 2019 (по одному) ✌ 32
  18. Перенос конфигов System.Configuration → Microsoft.Extensions.Configuration // .NET Framework var ftpHost

    = ConfigurationManager.AppSettings.Get("ftpHost"); // .NET Core var ftpHost = configuration.GetSection("FTP").GetValue("ftpHost"); 35
  19. Перевод остальных не исполняемых проектов ✓ выбрать проект ✓ перевести

    его на .NET Standard ◦ избавиться от зависимостей не поддерживающих .NET Standard ◦ изменить формат проекта со старого на новый ◦ обновить конфиги (если нужно) ✓ повторить для остальных проектов 36
  20. Неизменяемость внешних контрактов Авторизация в сервисе интеграции. Обрабатывали тип “x-www-form-urlencoded”.

    private void ConfigureOAuth (IAppBuilder app) { var oAuthServerOptions = new OAuthAuthorizationServerOptions () { TokenEndpointPath = new PathString("/auth.svc"), Provider = new DbAuthorizationServerProvider ( new ApiAuthService (GlobalVars.ConnectionString , GlobalVars.TelemedLogger) ) }; app.UseOAuthAuthorizationServer (oAuthServerOptions ); app.UseOAuthBearerAuthentication (new OAuthBearerAuthenticationOptions ()); } 40
  21. 41 Неизменяемость внешних контрактов Переписали на вроде бы работающий контроллер…

    [HttpPost] public async Task<AuthenticateResult > MoAuth([FromBody] MoLoginModel model) { return await _authService.Authenticate(model); }
  22. 42 Неизменяемость внешних контрактов Но забыли о типе данных. Авторизация

    сломалась. Тесты не пройдены. Заработала, немного изменив код. [HttpPost] [Consumes("application/x-www-form-urlencoded" )] public async Task<AuthenticateResult > MoAuth([FromForm] MoLoginModel model) { return await _authService.Authenticate(model); }
  23. 43 Еще пример о внешнем окружении { "PatientId": "457284", "PatientSnils"

    : "09820609384" } // Решение services.AddMvc() .AddJsonOptions (o => o.SerializerSettings .ContractResolver = new DefaultContractResolver ()); } { "patientId": "457284", "patientSnils" : "09820609384" } =
  24. Чиним тесты с NUnit ≥ 3.9.0 Установить адаптер NUnit3TestAdapter Установить

    пакет Microsoft.NET.Test.Sdk <ItemGroup> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" /> <PackageReference Include="NUnit" Version="3.9.0" /> <PackageReference Include="NUnit3TestAdapter" Version="3.9.0" /> </ItemGroup> https://github.com/nunit/docs/wiki/.NET-Core-and-.NET-Standard 44
  25. Замена роутов // Было using System.Web.Http; using System.Web.Http.Controllers; [ApiAuthorize] [RoutePrefix("api/medresearch"

    )] public class EquipmentController : BaseController { ... } // Стало using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; [Authorize] [Route("api/medresearch" )] public class EquipmentController : BaseController { ... } 45
  26. Переезд на CentOS • забыли о регистрозависимости ext4 /js/app.js !=

    /js/App.js • отказались от IIS, научились поднимать демонов • научились настраивать Nginx https://docs.microsoft.com/ru-ru/aspnet/core/host-and-deploy/linux-nginx 47
  27. Не забудьте • установить .NET Core SDK в СI •

    изменить профили публикаций 48
  28. Чек-лист ✓ мигрировать первый утилитарный проект на .NET Standard ✓

    перенести конфиги ✓ собрать решения ошибок и проблем ✓ мигрировать остальные не исполняемые проекты на .NET Standard ✓ мигрировать исполняемые проекты и тесты на .NET Core ✓ установить .NET Core SDK в CI, изменить профили публикаций ✓ оповестить клиентов о breaking changes в API, если они есть 49
  29. Вердикт • миграция заняла неделю чистого времени • в большинстве

    случаев понадобилось только обновление зависимостей и файла проекта • серьезные изменения потребовались в 3 проектах 50
  30. Что почитать? 51 https:/ /bit.ly/2YKRX1i • Перенос кода в .NET

    Core из .NET Framework • Миграция с ASP.NET на ASP.NET Core • CsprojToVs2017 • Анализатор переносимости .NET