#c# #.net #.net-core #entity-framework-core
#c# #.net #.net-core #entity-framework-core
Вопрос:
У нас есть приложения в .NET 4.5.2 (веб-приложение, веб-API, службы Windows и Windows Form). Все эти приложения совместно используют проект библиотеки (уровень базы данных с использованием ADO.NET ). Теперь мы собираемся конвертировать приложения в .NET Core одно за другим и запустили веб-приложение. Я перенес свой проект библиотеки на .NETStandard 2.1, и теперь он совместим с веб-приложением (.NET Core).
Мы решили, что не будем конвертировать приложения Windows Service и Windwos Form в .NET Core, но нам нужно преобразовать уровень базы данных в новый проект с новой технологией, такой как Entity Framework Core. Этот уровень базы данных будет использоваться приложениями .NET Core и .NET.NET. Итак, мой вопрос в том, как мне создать новый проект для уровня базы данных, который можно использовать как в приложениях .NET Core, так и в приложениях .NET как есть?
Есть несколько вариантов, но я не могу выбрать один из них, например (.NET Standard, .NET Core или .NET 4.8) Пожалуйста, помогите мне выбрать тот, который лучше всего подходит для моего сценария.
Спасибо.
Комментарии:
1. Есть только один вариант. Вы должны настроить таргетинг. NET Standard 2.0, пока вы не переместите все в .NET (Core) 5. .NET Standard 2.1 можно использовать только в проектах .NET Core 3
Ответ №1:
Есть только один вариант — настроить таргетинг на .NET Standard 2.0 и обновить исполняемые проекты как минимум до .NET 4.7.2.
Почему
.NET 4.8 по-прежнему является старым .NET, и смешивание .NET Core со старыми сборками .NET — это лишь временная мера, которая легко приводит к проблемам. .NET Standard 2.1 доступен только для .NET Core 3.1 и более поздних версий, так что это тоже не вариант. .NET 5 — это .NET Core 5, поэтому, если вы не перенесете все на него, это тоже не вариант.
Требуется .NET 4.7.2, поскольку это единственная версия, которая поддерживает .NET Standard 2.0 изначально. Использование .NET Standard 2.0 в более ранних версиях приводит к аду зависимостей, и даже MS советует против этого. Почти все пакеты NuGet теперь нацелены на NS 2.0, поэтому переход на 4.7.2 неизбежен, если вы не хотите использовать старые библиотеки с ошибками, которые были исправлены в более поздних версиях. .NET Framework 4.5.2 просто слишком устарел
Не говоря уже о ситуации с TLS — 4.5.2 по умолчанию не использует TLS1.2, что означает, что вам уже нужно использовать обходные пути для использования HTTPS для вызова служб, и вы не сможете использовать TLS1.3, даже если его поддерживают как клиентская, так и серверная ОС. Отсутствие HTTPS также означает отсутствие HTTP / 2.
Постепенная миграция
Однако вместо переноса каждого модуля в приложении вы можете ввести .Технологии NET Core постепенно. Все библиотеки расширений Microsoft, такие как внедрение зависимостей, настройка, ведение журнала, являются библиотеками .NET Standard 2.0, что означает, что вы можете использовать их и в старых приложениях .NET.NET.
Вы могли бы начать с представления Microsoft.Расширения.Ведение журнала и настройка для существующих приложений .NET Framework.
- Вместо использования глобального регистратора вы можете внедрить экземпляр ILogger в любой класс, которому требуется ведение журнала, например, через параметр конструктора.
- Вы можете заменить любые ссылки на ConfigurationManager или
Properties.Settings.Default
внедренными объектами конфигурации. В любом случае, это хороший дизайн, устраняющий любую зависимость от конкретных технологий настройки.
DI также можно легко добавить — ваш Main
метод должен будет точно так же настроить общий хост.Приложения NET Core выполняют, и формы должны будут принимать зависимости в своих конструкторах. В этой статье показано, как это сделать, но сам код прост:
[STAThread]
static void Main()
{
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var builder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<Form1>();
services.AddLogging(configure => configure.AddConsole());
services.AddScoped<IBusinessLayer, BusinessLayer>();
services.AddScoped<IDataAccessLayer, DataAccessLayer>();
});
var host = builder.Build();
.
using (var scope=host.Services.CreateScope())
{
var form1 = scope.GetRequiredService<Form1>();
Application.Run(form1);
}
}
Если Form1
используется внедрение зависимостей
public partial class Form1 : Form
{
private readonly ILogger _logger;
private readonly IBusinessLayer _business;
public Form1(ILogger<Form1> logger, IBusinessLayer business)
{
_logger = logger;
_business = business;
InitializeComponent();
}
...
}
Экземпляры logger и business layer будут созданы и переданы ему при GetRequiredService<Form1>()
вызове.
Комментарии:
1. Спасибо, @Panagiotis Kanavos за этот ответ, также хорошая идея о ConfigurationManager. Вы звезда!!!
Ответ №2:
Только netstd можно использовать как в проектах netfx, так и в проектах netcore. Таким образом, любые разделяемые библиотеки просто должны быть netstandard.
Другая идея — хотя, возможно, плохая, как указывает Панайотис Канавос, — это использовать вместо нее сервисную архитектуру. Вы можете создать свою базу данных в netfx или netcore, запустить ее как службу Windows и взаимодействовать через именованные каналы или TCP с процессом из любого другого приложения (приложений). Таким образом, вы можете оставить свою базу данных в netfx и конвертировать свои приложения в netcore одно за другим — я думаю, вы поняли суть.
Комментарии:
1.
Another option is to use a microservice architecture instead.
это вообще не вариант. Это службы с задержками в 100 тыс. раз больше, чем при вызове в памяти.micro
Префикс — это просто брендинг. Они по-прежнему являются службами, размещенными в отдельном приложении, вызываемыми по сети (даже если это оптимизировано на локальном компьютере). Переход от настольного приложения к многоуровневой архитектуре — это большое изменение с совершенно другими требованиями к производительности и дизайну. Вместо нескольких небольших вызовов приложению теперь приходится выполнять меньше больших вызовов, чтобы избежать накладных расходов2. Или, скорее, это вариант, такой же, как переключение Smart на пикап. Для езды по Лондону. Вы делаете это, только если вам действительно нужно.
3. @PanagiotisKanavos Спасибо за ваши мысли. Я согласен, и я больше пытался изложить все известные мне варианты — я изменил начало текста, чтобы, надеюсь, лучше отразить это.