Winforms: Como registrar formulários no contêiner IoC

fundo

Estou criando um aplicativo winforms em que estou usando um contêiner de IoC (SimpleInjector) para registrar meus tipos. No meu aplicativo, a maioria das telas (ou seja, formulários) terá apenas uma instância a qualquer momento.

Problema

Para formulários que precisam apenas de uma instância a qualquer momento, posso registrá-los como singletons:

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

Isso me permite usar o contêiner para acompanhar todos os formulários. Nesse caso, no entanto, quando um formulário é fechado, ele será descartado (os formulários implementam IDisposable). Se o aplicativo tentar abrir esse formulário novamente usando o contêiner, a instância do contêiner será descartada e uma exceção será lançada.

Pergunta, questão

Qual é a maneira correta de lidar com isso? Atualmente, vejo duas soluções:

Para cada formulário, substitua o formulário próximo para ocultar o formulário, em vez de realmente fechá-lo. Eu realmente não gosto dessa idéia. Sinto que prefiro fechar o formulário todas as vezes e começar com um novo / novo formulário.Registre o formulário com um estilo de vida transitório, e não como um singleton. Nesse caso, o contêiner realmente atua mais como uma fábrica. Tenho dois problemas: a) Perco a capacidade de rastrear formulários através do contêiner eb) o contêiner lança uma exceção durante a verificação dizendo que tipos descartáveis não devem ser registrados como transitórios (o que não entendo por que isso é ) Esses problemas se aplicam a formulários em que precisarei de várias instâncias ao mesmo tempo.

Eu posso solucionar o problema b) suprimindo o aviso de diagnóstico durante a verificação.

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

Qual é a abordagem correta a ser adotada aqui? Estou esquecendo de algo?

questionAnswers(1)

yourAnswerToTheQuestion