Миграция .Net Framework => .Net Core
Есть у нас приложение, разработку которого мы начали году в 2017
Состоит из 2 частей: Веб-приложение на и Бэкэнд (Windows Service, На схеме это ServiceHost)
между собой Веб-приложение и ServiceHost общаются по WCF плюс он еще принимает и отправляет данные по WCF третьим лицам
Основные требования заказчика выполнены и собрались мы его мигрировать на .Net #7.
Первые препятствия были поднять Windows сервис на .Net Core и WCF сервис - тут вроде разобрались
Потом споткнулись об отсутствие Workflow Foundation под Core, нашли вроде порт от энтузиастов, но там во-первых не полная поддержка (нет графического редактора Workflows), во-вторых у нас там кастомизировано слегка, так что пришлось эту идею отбросить и мигрировать только веб-проложение.
Но тут челлендж в том, что все остальное должно остаться .Net Framework(то есть веб на .Net #7 долен референцировать Persistence на .Net Framework 4.X, что само по себе вроде работает).
И сейчас боремся с тем, чтобы веб-приложние дружило с Persistence и его зависимостями(Entity Framework + Oracle.ManagedDataAccess)
Проблема в том, что в старом приложении был web.config, в котором мы говорили EF, что он должен работать с драйвером Оракла.
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<providers>
<provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="Oracle.ManagedDataAccess.Client" />
<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
В Net.Core ни веб ни эпп.конфига нет.
В общем или мы тупые или этот проект превращается в легаси.
Не переживайте во всём можно разобраться, только нужно время
А в чём проблема с ораклом? Работает без проблем, строка соединения в appsettings.json
Где то примерно так
{ "AppSettings": { "IsSqlite": false, "ConnectionString": "Host=myhost; user id=myuser; database=mydb;", "DbPassword": "<set value into secrets.json", }, </set>
services.AddDbContext<AppDbContext>( optionsBuilder => { { optionsBuilder.UseOraclel($"password={appSettings.DbPassword};{appSettings.ConnectionString}"); optionsBuilder.EnableSensitiveDataLogging().LogTo(l => Debug.WriteLine(l)); optionsBuilder.EnableDetailedErrors(true); optionsBuilder.LogTo(l => Debug.WriteLine(l)); } }, ServiceLifetime.Transient);А зачем WCF затащили?
отчего так? Не видел еще что бы так делали
REST Api выдает что нужно из ДБ, а морда общается с АПИ
не вижу смысла общаться контроллерам из ASP.Net MVC с базой данных через посредника в лице бэкэнда.
И почему WCF(Soap), а не Rest - в .Net он гораздо лучше (был) интегрирован.
в .Net он гораздо лучше (был) интегрирован
Вероятно ударение на был. Для меня это какая то старая рухлядь.
https://learn.microsoft.com/ru-ru/dotnet/architecture/grpc...
не вижу смысла общаться контроллерам из ASP.Net MVC с базой данных
А в чём тогда смысл?
https://en.wikipedia.org/wiki/ASP.NET_MVC - It is no longer in active development. В этом?
Как заставили работать WCF на дотнете 5+? Вроде, там кроме какой-то замены, пилимой командой энтузиастов, не было? Мы у себя отказались.
Веб конфигов в дотнете 5+ нет - теперь всё в джейсоне хранится. Но суть та же - та же строка подключения.
Не знаю, как у вас общаются между собой приложения между дотнет 4- и 5+ (через какие-то независимые схемы обмена данными, типа REST?), но если код написан на 4- без задействования либ, зависящих от 4-, то он без изменений переносится в 5+. У нас надо какое-то время в проекте держать и версии 4-, и версии 5+. Для этого мы в проекты 5+ добавляет ссылки на исходные файлы (add as link) 4-. А ещё раньше часть либ на .NET Standard переводилась (зачастую тоже через add as link).
По букварям по миграциям прошлись?
https://learn.microsoft.com/en-us/dotnet/core/porting/
https://learn.microsoft.com/en-us/aspnet/core/migration/pr...
https://learn.microsoft.com/en-us/dotnet/architecture/blaz...
Там ещё надо внимательным быть при выборе миграции на какую 5+ версию. 5, 6 и 7 между собой немного отличаются, а 5 и 6 - довольно таки много. И может статься (т.е. я не уверен), что сразу мигрировать на 7 не получится - придётся в некоторых местах пройти все миграции последовательно: 4 - 5 - 6 - 7.
У нас тоже есть слой Workflows, но по мне это хрень какая-то, если приложение не прямо мегамонструозное. При анализе кода заметил, что часть работы, которая писалась в слое Workflows, также присутствовала и в бизнес логике. Т.е. по сути пофиг было, где эту логику писать, а лишний слой лишь усложнял понимание. Хотя, может так стало после многочисленных переписываний кода (нам досталась версия возрастом лет 15 после минимум двух команд).
В общем или мы тупые или этот проект превращается в легаси.
Вы - тупые легаси, старпёры и замшелые динозавры. Переходите на MAUI и Blazor, пока вас не стёрла с лица земли молодая шпана. )))
Всё это дерьмо упрощается до
если использовать Blazor и MAUI. Т.е. стрелочек от бизнеса и далее к клиентам может быть максимум по 2.
Но для вытряхивания денег из заказчиков можно, конечно, рисовать лабиринты и ребусы.
services.AddDbContext<AppDbContext>( optionsBuilder => { { optionsBuilder.UseOraclel($"password={appSettings.DbPassword};{appSettings.ConnectionString}"); optionsBuilder.EnableSensitiveDataLogging().LogTo(l => Debug.WriteLine(l)); optionsBuilder.EnableDetailedErrors(true); optionsBuilder.LogTo(l => Debug.WriteLine(l)); } }, ServiceLifetime.Transient);
Функция AddDbContext это часть EntityFrameworkCore
а мне нужно оставить EntityFramework 6, чтобы работал ServiceHost и все остальное
Как заставили работать WCF на дотнете 5+? Вроде, там кроме какой-то замены, пилимой командой энтузиастов, не было? Мы у себя отказались.
есть ограничения, не все байндинги реализованы, не нашел возможности поднимать несколько сервисов на разных портах, но вроде работает
Веб конфигов в дотнете 5+ нет - теперь всё в джейсоне хранится. Но суть та же - та же строка подключениястрока подключения - фигня
вот как сказать ЕФ, чтобы он работал с драйвером оракла - не пойму
https://github.com/CoreWCF
Это коммьюнити проджект. Со всеми вытекающими. Официально МС забила на WCF.
есть ограничения, не все байндинги реализованы
Я это ещё год с лишним назад смотрел, и тогда тоже было "не все байндинги реализованы". Прошёл год с лишним, а оно всё ещё "не все...", и нет гарантий, что будут все. МС педалит свой СигналР, и хотя в начале говорили, что не на замену, но чем дальше, тем больше похоже на замену.
https://www.reddit.com/r/csharp/comments/whz0zk/replacing_...
Простой проект на WCF (см. пример в первой ссылке на блог коммьюнити) и на SignalR по объёму почти равны, но в примере WCF лишь код для самой WCF, без обвязки в виде клиента, а в примере SignalR - со всей обвязкой. Вот ещё букварь с примером на СигналР.
Вообще, желание повязать Дотнет 4- и 5+ хреновое. По букварям с миграциями там для неподдерживаемых технологий, коих не так уж мало, просто стоит "побрейтесь". В лучшем случае - "вот вам коммьюнити проект, ждите реализации нужных вам фич, или реализуйте сами".
Многие проблемы решает добавление либы Microsoft.Windows.Compatibility.
Старые сторонние либы можно заменить аналогами (например, логгер log4net на что-то актуальное).
Про WCF уже сказали.
System.EnterpriseServices (COM+) - нет.
Тут ещё. Для WWF предлагается ещё один коммьюнити проект.
Вообще, желание повязать Дотнет 4- и 5+ хреновое.
или так, или все переделывать. Такое заказчику не продашь.
Для WWF предлагается ещё один коммьюнити проект.
спасибо, кэп.
Получается что Repository pattern не пользуете, предложение напрямую к базе обращается? Брр.
Вот ту вроде готовый пример есть, там они контекст сервисом сделали.
https://learn.microsoft.com/en-us/aspnet/core/data/entity-...