@romaro

Где хранить глобальный стейт приложения, написанного на Винформах?

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

1) Хранить в инстансе главной формы, которую получать примерно таким образом:
Form1 GetMainForm()  
{  
  foreach (Form form in Application.OpenForms)  
    if (form is MainForm)  
      return (MainForm)form;  
  return null;  
}


2)
Поднять встроенный в Microsoft.Extensions.Hosting DI и каждый раз тянуться:
using (var pg = Program.ServiceProvider.GetRequiredService<PostgresProvider>())
     pg.DoSomething();


Я пока склоняюсь ко второму варианту, т.к. использую его в WPF. Но может быть для WF-приложений есть другая устоявшаяся практика?
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 1
@romazhan
Для хранения глобального стейта приложения существует несколько вариантов:
  1. Хранение в статических переменных: Вы можете хранить глобальный стейт в статических переменных класса. Этот вариант хорошо подходит, если глобальный стейт нужен для всего приложения и не изменяется. Однако, статические переменные могут быть небезопасными в многопоточном окружении (риск неочевидных проблем с тестированием).
  2. Хранение в инстансе главной формы: этот вариант может быть хорошим выбором, если глобальный стейт используется только в рамках главной формы и доступ к нему, из других частей приложения, не требуется. Однако, этот вариант не очень хорош, если главная форма не существует или не открыта.
  3. Использование DI-контейнера: этот вариант может быть хорошим выбором, если Вы используете DI в своем приложении. Вы можете регистрировать ваш синглтон-провайдер базы данных и другие глобальные переменные в контейнере DI и получать доступ к ним из любой части приложения с помощью зависимостей. Я считаю этот вариант самым лучшим, так как он позволяет следовать принципу единственной ответственности, упрощает тестирование, улучшает возможности масштабирования и расширения приложения.

Важно понимать, что нужно соблюдать соглашения об использовании глобального стейта в рамках вашего приложения и обеспечивать правильное синхронизирование доступа к нему в многопоточном окружении. В общем случае, если Ваше приложение сложное и использует DI, то использование DI-контейнера для хранения глобального стейта может быть хорошим выбором. Этот вариант позволяет управлять зависимостями и обеспечивает хорошую масштабируемость и расширяемость.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы