Winforms: Как зарегистрировать формы с контейнером IoC

Фон

Я создаю приложение winforms, где я использую контейнер IoC (SimpleInjector) для регистрации своих типов. В моем приложении большинство экранов (т.е. форм) будут иметь только один экземпляр в любой момент времени.

проблема

Для форм, которым нужен только один экземпляр в любой момент времени, я могу зарегистрировать их как синглтоны:

container.Register<IHomeView, HomeView>(Lifestyle.Singleton);

Это позволяет мне использовать контейнер для отслеживания всех форм. В этом случае, однако, когда форма закрывается, она удаляется (формы реализуют IDisposable). Если приложение попытается снова открыть эту форму, используя контейнер, экземпляр контейнера формы будет удален, и будет сгенерировано исключение.

Вопрос

Как правильно бороться с этим? В настоящее время я вижу два решения:

Для каждой формы переопределите форму, близкую к тому, чтобы скрыть форму, а не закрывать ее. Мне не очень нравится эта идея. Я чувствую, что предпочитаю каждый раз закрывать форму и начинать с новой / новой формы.Зарегистрируйте форму с временным образом жизни, а не как синглтон. В этом случае контейнер действительно просто действует как фабрика. Я сталкиваюсь с двумя проблемами: а) я теряю способность отслеживать формы через контейнер и, б) контейнер выдает исключение во время проверки, говоря, что одноразовые типы не должны быть зарегистрированы как переходные (что я не понимаю, почему это так. ). Эти проблемы относятся и к формам, где мне также понадобится несколько экземпляров одновременно.

Я могу обойти проблему б), подавив диагностическое предупреждение во время проверки.

registration = container.GetRegistration(typeof(ILoginView)).Registration;
registration.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, "Winforms registration supression.");

Какой правильный подход следует использовать здесь? Я что-то пропустил?

Ответы на вопрос(1)

Ваш ответ на вопрос