Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Миграция .Net Framework => .Net Core

1848  1 2 3 все
Срыв покровов патриот07.08.23 14:26
07.08.23 14:26 

Есть у нас приложение, разработку которого мы начали году в 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 ни веб ни эпп.конфига нет.
В общем или мы тупые или этот проект превращается в легаси.


#1 
Срыв покровов патриот07.08.23 14:27
NEW 07.08.23 14:27 
в ответ Срыв покровов 07.08.23 14:26

#2 
AlexNek патриот07.08.23 18:10
AlexNek
NEW 07.08.23 18:10 
в ответ Срыв покровов 07.08.23 14:26

Не переживайте во всём можно разобраться, только нужно время

А в чём проблема с ораклом? Работает без проблем, строка соединения в 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 затащили?
#3 
AlexNek патриот07.08.23 18:13
AlexNek
NEW 07.08.23 18:13 
в ответ Срыв покровов 07.08.23 14:27

А отчего так? Не видел еще что бы так делали смущ

REST Api выдает что нужно из ДБ, а морда общается с АПИ

#4 
AlexNek патриот07.08.23 18:35
AlexNek
NEW 07.08.23 18:35 
в ответ Срыв покровов 07.08.23 14:27
Срыв покровов патриот07.08.23 21:10
NEW 07.08.23 21:10 
в ответ AlexNek 07.08.23 18:13
отчего так? Не видел еще что бы так делали смущ
REST Api выдает что нужно из ДБ, а морда общается с АПИ

не вижу смысла общаться контроллерам из ASP.Net MVC с базой данных через посредника в лице бэкэнда.


И почему WCF(Soap), а не Rest - в .Net он гораздо лучше (был) интегрирован.

#6 
AlexNek патриот07.08.23 22:25
AlexNek
NEW 07.08.23 22:25 
в ответ Срыв покровов 07.08.23 21:10
в .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. В этом?

#7 
Срыв покровов патриот07.08.23 23:36
NEW 07.08.23 23:36 
в ответ AlexNek 07.08.23 22:25

Насчёт gRPC надо почитать, спасибо.

Но моя цель сейчас это миграция малой кровью.

WCF меня всем устраивает.

#8 
Срыв покровов патриот07.08.23 23:39
NEW 07.08.23 23:39 
в ответ AlexNek 07.08.23 22:25, Последний раз изменено 07.08.23 23:40 (Срыв покровов)

да, ASP.net MVC больше не обновляется, поэтому и рассматривается вариант обновления проекта WebApplication на ASP.net Core. Хотя сильно много нового там и нет.

#9 
alex445 коренной житель08.08.23 06:57
NEW 08.08.23 06:57 
в ответ Срыв покровов 07.08.23 14:26, Последний раз изменено 08.08.23 07:03 (alex445)

Как заставили работать 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.

#10 
alex445 коренной житель08.08.23 07:06
NEW 08.08.23 07:06 
в ответ Срыв покровов 07.08.23 14:27, Последний раз изменено 08.08.23 07:07 (alex445)

У нас тоже есть слой Workflows, но по мне это хрень какая-то, если приложение не прямо мегамонструозное. При анализе кода заметил, что часть работы, которая писалась в слое Workflows, также присутствовала и в бизнес логике. Т.е. по сути пофиг было, где эту логику писать, а лишний слой лишь усложнял понимание. Хотя, может так стало после многочисленных переписываний кода (нам досталась версия возрастом лет 15 после минимум двух команд).

#11 
alex445 коренной житель08.08.23 07:10
NEW 08.08.23 07:10 
в ответ Срыв покровов 07.08.23 14:26, Последний раз изменено 08.08.23 07:42 (alex445)
В общем или мы тупые или этот проект превращается в легаси.

Вы - тупые легаси, старпёры и замшелые динозавры. Переходите на MAUI и Blazor, пока вас не стёрла с лица земли молодая шпана. )))


Всё это дерьмо упрощается до



если использовать Blazor и MAUI. Т.е. стрелочек от бизнеса и далее к клиентам может быть максимум по 2.

Но для вытряхивания денег из заказчиков можно, конечно, рисовать лабиринты и ребусы.

#12 
Срыв покровов патриот08.08.23 09:15
NEW 08.08.23 09:15 
в ответ AlexNek 07.08.23 18:10
  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 и все остальное

#13 
Срыв покровов патриот08.08.23 09:18
NEW 08.08.23 09:18 
в ответ alex445 08.08.23 07:10
Переходите на MAUI и Blazor, пока вас не стёрла с лица земли

Алёша, переходи на клинское
водка на тебя плохо действует

#14 
Срыв покровов патриот08.08.23 09:22
NEW 08.08.23 09:22 
в ответ alex445 08.08.23 06:57
Как заставили работать WCF на дотнете 5+? Вроде, там кроме какой-то замены, пилимой командой энтузиастов, не было? Мы у себя отказались.

https://github.com/CoreWCF

есть ограничения, не все байндинги реализованы, не нашел возможности поднимать несколько сервисов на разных портах, но вроде работает

Веб конфигов в дотнете 5+ нет - теперь всё в джейсоне хранится. Но суть та же - та же строка подключениястрока подключения - фигня

вот как сказать ЕФ, чтобы он работал с драйвером оракла - не пойму

#15 
Murr патриот08.08.23 10:04
Murr
NEW 08.08.23 10:04 
в ответ Срыв покровов 08.08.23 09:22

как сказать ЕФ, чтобы он работал с драйвером оракла

------

Там нужно сбросить текущую конфигурацию - она по умолчанию под МС - и задать оракловские параметры.

Детали сейчас не скажу - давно делал.

#16 
alex445 коренной житель08.08.23 11:03
NEW 08.08.23 11:03 
в ответ Срыв покровов 08.08.23 09:22, Последний раз изменено 08.08.23 11:11 (alex445)
https://github.com/CoreWCF

Это коммьюнити проджект. Со всеми вытекающими. Официально МС забила на WCF.


есть ограничения, не все байндинги реализованы

Я это ещё год с лишним назад смотрел, и тогда тоже было "не все байндинги реализованы". Прошёл год с лишним, а оно всё ещё "не все...", и нет гарантий, что будут все. МС педалит свой СигналР, и хотя в начале говорили, что не на замену, но чем дальше, тем больше похоже на замену.

https://www.reddit.com/r/csharp/comments/whz0zk/replacing_...


Простой проект на WCF (см. пример в первой ссылке на блог коммьюнити) и на SignalR по объёму почти равны, но в примере WCF лишь код для самой WCF, без обвязки в виде клиента, а в примере SignalR - со всей обвязкой. Вот ещё букварь с примером на СигналР.

#17 
alex445 коренной житель08.08.23 11:18
NEW 08.08.23 11:18 
в ответ alex445 08.08.23 11:03, Последний раз изменено 08.08.23 11:21 (alex445)

Вообще, желание повязать Дотнет 4- и 5+ хреновое. По букварям с миграциями там для неподдерживаемых технологий, коих не так уж мало, просто стоит "побрейтесь". В лучшем случае - "вот вам коммьюнити проект, ждите реализации нужных вам фич, или реализуйте сами".


Многие проблемы решает добавление либы Microsoft.Windows.Compatibility.

Старые сторонние либы можно заменить аналогами (например, логгер log4net на что-то актуальное).

Про WCF уже сказали.

System.EnterpriseServices (COM+) - нет.

Тут ещё. Для WWF предлагается ещё один коммьюнити проект.

#18 
Срыв покровов патриот08.08.23 12:56
NEW 08.08.23 12:56 
в ответ alex445 08.08.23 11:18
Вообще, желание повязать Дотнет 4- и 5+ хреновое.

или так, или все переделывать. Такое заказчику не продашь.

Для WWF предлагается ещё один коммьюнити проект.

спасибо, кэп.

#19 
AlexNek патриот08.08.23 17:49
AlexNek
NEW 08.08.23 17:49 
в ответ Срыв покровов 08.08.23 09:15

Получается что Repository pattern не пользуете, предложение напрямую к базе обращается? Брр.

Вот ту вроде готовый пример есть, там они контекст сервисом сделали.

https://learn.microsoft.com/en-us/aspnet/core/data/entity-...

#20 
1 2 3 все