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.");
Какой правильный подход следует использовать здесь? Я что-то пропустил?