In meiner Anwendung (MVVM-Architektur basierte WPF-Anwendung) verwende ich eine Menge ICommand
s als Dienste. Einige dieser Befehle können an Menüelemente, Symbolleisten, Statusleisten usw. gebunden werden, wo sie in die entsprechenden Containeransichtsmodelle eingefügt werden. Nun sind einige von ihnen zum Beispiel in der Lage, Daten auf der Shell der Anwendung zu manipulieren, so dass die Shell eine Abhängigkeit von ihnen ist. Da die Shell auch diese Container hostet (Menü, Statusleiste ...), bekomme ich eine zirkuläre Abhängigkeit. (Shell -> Menü -> Befehl -> Shell).Circular Abhängigkeiten und Inversion der Kontrolle - wie diese zu lösen?
Derzeit verwende ich MEF, um meine Anwendung zu verfassen, so dass die meiste Zeit das Problem durch Eigentum oder private Mitgliederinjektion gelöst werden kann, aber ich habe das Gefühl, dass dies eine Art üble Praxis ist (ein Dienst hat keine Möglichkeit) einem Elternteil mitteilen, dass er diese Abhängigkeit benötigt, obwohl dies der Fall ist).
Meine Frage ist: Was ist ein gemeinsamer Weg ist ein Problem wie dieses zu lösen:
class Shell : IShell
.ctor(IMenu)
class Menu : IMenu
.ctor(ICommand[])
class ExitCommand : ICommand
.ctor(IShell)
Zwei gängige Methoden, um einen Befehl von einem übergeordneten Ansichtsmodell ('Shell') aufzurufen oder global verfügbare Befehle zu haben, sind' EventAggregator' -Implementierungen ('PubSubEvent' in' Prism') oder 'CompositeCommand' (wieder' Prism')). – mechanic
Was ist die "Shell"? Könntest du es mehr beschreiben? – Joe
@Joe Die Shell ist hauptsächlich ein Ansichtsmodell, das als Container für alle anderen Ansichtskomponenten dient. – artganify