Pass Autofac-container der WPF-UserControl
Ich bin mit autofac zu beheben, Views und ViewModels in einer WPF-Anwendung. IComponentContext übergeben wird, in den Blick automatisch.
Beispiel:
public BusinessAuto(int proposedCoverageId, IComponentContext componentContext)
{
DataContext = componentContext.Resolve<BusinessAutoViewModel>(new TypedParameter(typeof(Int32), proposedCoverageId));
InitializeComponent();
}
In der XAML-Code für diese Ansicht gibt es Benutzersteuerelemente erstellt wird, die haben Ihre eigene ViewModels. Ein Beispiel:
<userControl:AdditionalCoveragesControl Margin="0,10"/>
Autofac ist nicht erstellen Sie das Benutzersteuerelement (die Ansicht) so Autofac nicht injizieren von Abhängigkeiten in der UserControl-Konstruktor.
Wie bekomme ich den Verweis auf IComponentContext in ein Benutzersteuerelement, das ist deklariert in der ersten Ansicht XAML?
Ich das Gefühl, dass ich entweder müssen Autofac irgendwie schaffen, mein UserControl, das ich brauche, um wieder entmutigt Globale statische container (ick), oder ich muss mit einem DependencyProperty-pass den container nach unten (ick auch).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde nicht Spritzen (was effektiv ist) Ihre container, ist diese als eine minderwertige form von inversion of control, Service Locator, mit Mängel, können zusammengefasst werden, indem Sie Ihre aktuelle situation: Sie am Ende brauchen, um zu injizieren, die container in ALLES.
Stattdessen müssen Sie nähern sich dem problem aus der Sicht des "Was ist diese Komponente verantwortlich für das erstellen und was braucht es, um es zu tun?"
Wie erwähnt von Lonni-Loki, ist eine option, um zu injizieren, ein vollständig geformtes Steuerelement-aber ich Stimme in diesem Punkt: wenn die Haupt-Ansicht hat die Aufgabe der Erstellung dieser sub-Komponente, dann sollte es zu schaffen ist - aber die Erleichterung, dass die Verantwortung, sollten Sie injizieren die Hauptansicht mit den Dienstleistungen/Modelle/etc. würde es dann brauchen, weitergeben oder anderweitig verwenden, um es zu schaffen. Autofac die factory-Methode stubs sind ideal für diese:
Beispielsweise wenn der sub-Ansicht muss ein IFooViewModel, können Sie Spritzen den Behälter mit Func<IFooViewModel< (einer Fabrik-Methode registriert mit Kontext), die Sie dann verwenden können, um die "feed on demand" das neue darin enthaltenen anzeigen.
(oder eine Func<arg1, arg2 usw., IFooViewModel>, wie Ihre Bedürfnisse erfordern)
Eine praktische Faustregel ist, wenn man die Klasse X, die erste nehmen, überall, das Sie "neue" alles und anstatt pass, der in den Konstruktor. Schauen Sie sich jetzt den code und fragt sich: "Wenn ich wollte, eine Instanz der Klasse X, was würde ich brauchen, um passieren die Konstruktor?" Das sind Ihre Abhängigkeiten.
Nehmen wir ein praktisches Beispiel...sagen, Sie haben eine Struktur wie diese:
Anwendung erstellt MainWindow
MainWindow erstellt SubView1, muss IMainWindowViewModel
SubView1 muss ISubView1Model, IFooService
SubView1 erstellt SubView2
SubView2 muss ISubView2Model, IBarService
Also unsere ctors würde wie folgt Aussehen:
Beim aufstellen Ihrer container, die Sie haben würden, so etwas wie so:
(beachten Sie, ich verwenden eine Vielzahl von IoC-Containern, so meine Autofac syntax könnte rostig)
Den glorreichen (und meiner Meinung nach, nur bei IoC-containers ist die "Du herausfinden, wie man all die bits basierend auf dem, was ich habe Ihnen schon gesagt" Teil - sonst, Sie könnte genauso gut verwenden Sie die manuelle Injektion, wo Sie gehen in Abhängigkeiten von hand. Das heißt, unsere potenziell komplizierte Konstruktion von MainWindow ist jetzt nur:
Ich hoffe ich habe nicht zu viele Tippfehler/Fehler im code, aber ich habe nicht verwendet Autofac für eine Weile.
Darf nicht passieren componentContext zu BusinessAuto Sicht, stattdessen sollten Sie pass AdditionalCoveragesControl.
XAML:
Dann werden alle deine Ansichten werden unabhängig von Autofac, Sie sollten sich nur registrieren, alle von Ihnen im container.