2016-04-01 4 views
1

Ich versuche Prism 6 UWP Application zu entwickeln. Mein aktuelles Problem ist, dass ich alle Objekte registrieren möchte, die in Application mit Unity Dependency-Injektionscontainern verwendet werden. Aber so viele UI-Objekte werden von der Infrastruktur erstellt (Activator.CreateInstance (type)) und keine Möglichkeit, ihre Erstellung durch Dependency Conitiner auszulösen.Ich wäre in Ordnung, auch wenn ich erstellte Objekte mit DI conatiner registrieren. Ich habe Github Beispielanwendung AdventureWorks.Shopper in Prism-Beispielen verwiesen. Hier sah ich, dass Ansichten von Infrastruktur erstellt werden, aber einige andere Objekte werden von Dependency injection conatiner erstellt.Einheit Container Verwendung in UWP

Gibt es eine Möglichkeit, alle Objekte in Anwendungen zu erhalten und sie bei DI conatiner zu registrieren?

Gibt es eine Möglichkeit, alle Objekte in Anwendungen zu erhalten und sie mit DI-Container zu registrieren oder die gesamte Erstellung über DI Conatiner auszulösen?

+0

Möchten Sie eine Objektmenge über den Abhängigkeitscontainer registrieren, in den Sie reflektieren können? Können Sie über die Typen in den geladenen Assemblys nachdenken und sie in den DI-Container laden, wobei die Instanziierungsmethode Activator.CreateInstance ist? – QiMata

+0

Wenn ich dies tue, erhalte ich doppelte Objekte. Einige UI-Objekte werden von framework.So tatsächlichen UI angezeigt wird mit diesem Objekt. Aber mein DI-Container hat eine andere Instanz der gleichen Klasse –

+0

Ein Weg, fanden wir, können wir Container zugreifen wie dieser unityContainer = (UnityContainer) ((Prism.Unity.Windows.PrismUnityApplication) Application.Current) .Container ;. Objekte, die von Framework erstellt werden, können mit Einheit registriert werden, indem Registrierungen in Konstruktor api Beispiel unityContainer.RegisterInstance (this); –

Antwort

2

Im Allgemeinen sollten Sie nicht versuchen, Ihre UI-Objekte vom Container erstellen zu lassen, denn wie Sie erwähnen, ist der XAML-Analyseprozess (Infrastruktur wie Sie es nennen) dafür verantwortlich und es gibt keinen einfachen Weg hinein zu kommen die Schleife, um diesen Bauprozess zu übernehmen.

Dies ist einer der Gründe, warum wir den ViewModelLocator zu Prism hinzugefügt - so dass aus dem Ansichtsmodell nach unten durch all seine Abhängigkeiten, können Sie die SetDefaultViewModelFactory Methode verdrahten können, den Behälter verwenden, um die Konstruktion aller Ihre Viewmodel zu tun und ihre Abhängigkeiten (und die Abhängigkeiten ihrer Abhängigkeiten usw.), solange Sie ViewModelLocator verwenden, um die View mit dem ViewModel zu verbinden. Wenn Sie dem MVVM-Muster gut folgen, sollte es fast nie notwendig sein, die UI-Objekte selbst über den Container zu erstellen, da sie keine Logik im Code dahinter ausführen sollten, die von den von der Container. Aber das heißt nicht, dass Sie nie tun müssen. Also für die Situationen, in denen Sie das tun müssen, können Sie entweder durch den Application.Current zum Container gelangen, wie von S Vasudev mit Casting vorgeschlagen. Oder wenn Sie das ein paar Plätze brauchen und nicht das ganze "Rauschen" im Code haben wollen, dann schreiben Sie ein einfaches Hilfsobjekt mit einer statischen Eigenschaft, die Sie in der OnInitializeAsync-Methode der App-Klasse und dann einfach setzen können Zugriff überall

Wenn Sie das in mehr als ein paar Orten tun, sollten Sie beginnen, Ihr Design in Frage zu stellen. Und ja, Statik (Globals) sind böse und sollten nach Möglichkeit vermieden werden. Aber wenn es nur ein paar Stellen im Code hinter einigen Ansichten gibt, müssen Sie manchmal ein pragmatischer Programmierer sein, der Dinge erledigt, und kein MVVM-Purist, der die Dinge zu kompliziert macht, nur um ein paar kleinere Verstöße gegen die MVVM-Anleitung zu vermeiden.

0

Ein Weg, wir fanden: - Sie Einheit-Container wie folgt zugreifen können: -
unityContainer = (UnityContainer) ((Prism.Unity.Windows.PrismUnityApplication) Application.Current) .Behälter;

Im Konstruktor von Objekten, die von Activator.CreateInstance erstellt werden, können wir den Einheitscontainer verwenden und diese Instanz für den Einheitscontainer registrieren.

Auf diese Weise werden alle Objekte mit Unity conatiner registriert Beispiel: - unityContainer.RegisterInstance (this);