WPF und DI Container

Ghost_Rider_R

Lieutenant
Registriert
Nov. 2009
Beiträge
787
Hallo zusammen,

ich habe eine WPF-Anwendung und einen DI-Container, welcher leider intern nicht verwendet wird.

In der Zeile applikation.Run(hauptGUI); wird diese Ausnahme geworfen:

...wurde kein übereinstimmender Konstruktor gefunden. Der Typ kann mit der Arguments- oder der FactoryMethod-Direktive erstellt werden.

Ich habe dabei eine HauptGUI, welche durch meinen DI-Container korrekt zusammengebaut wird. Diese lädt beim Aufruf im Hintergrund eine Page (Seite --> Klasse ,,Bildschirm") nach, welche mein IServiceProvider auch erstellen kann:

var bildschirm = diHoler.HolenBenoetigteInstanz<Bildschirm>();

Dies passiert durch diesen XAML-Code:

1740739496860.png


Das Problem ist jetzt, dass in der Zeile applikation.Run(hauptGUI); wohl versucht wird ein Objekt von der Klasse Bildschirm zu erzeugen (welche keinen parameterlosen Konstruktor hat) und dabei wird wohl ein eigenständiger / interner IServiceProvider verwendet, welcher die Klasse nicht kennt.

Wie kann ich Visual Studio dazu bringen, dass er meinen IServiceProvider zum Auflösen der Abhängigkeiten verwendet und nicht einen internen?

C#:
class Program
{
    [STAThread]
    static void Main()
    {
        try
        {
            var ratDIErsteller = new RATDIErsteller();
            var diHoler = ratDIErsteller.ErstellenDI();
            var hauptGUI = diHoler.HolenBenoetigteInstanz<HauptGUI>();
            var applikation = diHoler.HolenBenoetigteInstanz<Application>();

            //dieser muss zur Auflösung genutzt werden:
            var serviceProvider = diHoler.HolenBenoetigteInstanz<IServiceProvider>();

            //Hier passiert die Ausnahme:
            applikation.Run(hauptGUI);
            Environment.Exit(0);
        }
        catch ()
        {          
            Environment.Exit(1);
        }
    }
}

Vielen Dank schon mal für eure Hilfe.

LG
Ghost Rider
 
ich kann nicht einschätzen, ob dir ein allgemeiner Hinweis bereits weiterhilft:
du hast ja immer auch die Option im Codebehind der xaml, hier sicherlich hauptGUI.xaml.cs, die gui Elemente zu beeinflussen.
falls dir hierbei eine eigene Methode nicht ausreichend DI ist:
kannst du HauptGui eine Bildschirm property hinzufügen, welche du von DI füllen lässt. In der Absicht, diese in der xaml Frame Deklaration zu nutzen.
 
Vom Prinzip her wäre das denkbar, das ist die XAML-Zeile, welche zum Erstellen eines neues Objektes führt:

<Frame Source="/GUIs/HauptGUIs/Bildschirme/Bildschirm.xaml"/>

Mir wäre es aber lieber, wenn das direkt in der HauptGUI.cs im Konstruktor gesetzt werden könnte.
Wie würde ich denn diesem Frame direkt sein Objekt zuweisen, sodass dieser nicht neu erstellt werden muss?

Ich habe es jetzt mal wie folgt angepasst, aber der Fehler ist noch unverändert:
<Frame Source="/GUIs/HauptGUIs/Bildschirme/Bildschirm.xaml" Name="frameBildschirm"/>

Und im Konstruktor der Haupt-GUI:
var fb = new Frame { Content = bildschirm ?? throw new ArgumentNullException(nameof(serverVerbindung), "Es wurde kein Bildschirm übergeben.") };
frameBildschirm = fb;

Er versucht wohl weiterhin einen neuen Frame zu erzeugen...

Hat hier jemand eine Idee?
 
Zurück
Oben