Winforms: So registrieren Sie Formulare beim IoC-Container

Hintergrun

Ich erstelle eine Winforms-Anwendung, bei der ich einen IoC-Container (SimpleInjector) verwende, um meine Typen zu registrieren. In meiner Anwendung hat ein Großteil der Bildschirme (d. H. Formulare) jeweils nur eine Instanz.

Proble

Für Formulare, die jeweils nur eine Instanz benötigen, kann ich sie als Singletons registrieren:

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

Dadurch kann ich den Container verwenden, um alle Formulare zu verfolgen. In diesem Fall wird ein geschlossenes Formular jedoch gelöscht (Formulare implementieren IDisposable). Wenn die Anwendung versucht, das Formular mithilfe des Containers erneut zu öffnen, wird die Instanz des Formulars des Containers gelöscht und eine Ausnahme ausgelöst.

Frag

Was ist der richtige Weg, um damit umzugehen? Ich sehe derzeit zwei Lösungen:

Überschreiben Sie für jedes Formular das Formular in der Nähe, um das Formular auszublenden, anstatt es tatsächlich zu schließen. Ich mag diese Idee nicht wirklich. Ich habe das Gefühl, ich würde das Formular lieber jedes Mal schließen und mit einem neuen / frischen Formular beginnen. Registrieren Sie das Formular mit einem vorübergehenden Lebensstil anstatt als Singleton. In diesem Fall fungiert der Container eher als Fabrik. Ich habe zwei Probleme: a) Ich verliere die Fähigkeit, Formulare durch den Container zu verfolgen, und b) der Container löst während der Überprüfung eine Ausnahme aus, die besagt, dass Einwegtypen nicht als vorübergehend registriert werden sollten (was ich nicht verstehe, warum das so ist) ). Diese Probleme treten beide bei Formularen auf, bei denen mehrere Instanzen gleichzeitig benötigt werden.

Ich kann das Problem umgehen b) indem ich die Diagnosewarnung während der Überprüfung unterdrücke.

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

Was ist der richtige Ansatz hier? Vermisse ich etwas?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage