In this stackoverflow question habe ich gelernt, dass Prism/Unity nicht so entkoppelt ist, wie ich dachte, z. Wenn ich diese Klasse habe, die menuManager in seinen Konstruktor injiziert, dann muss ich sicherstellen, dass diese Klasse eigentlich irgendwo existiert (ich dachte, dass Sie einfach die .dll ziehen könnten, die die Klasse enthält und der Container würde damit umgehen) es, zB eine null an seinem Platz) Injektion:Wie kann ich Module in Prism lose referenzieren, damit sie existieren können oder nicht?
public class EmployeesPresenter
{
public EmployeesPresenter(IMenuManager menuManager)
{
}
}
aber ich kann damit umgehen: die Anwendung nicht ohne MenuModule (oder auch laufen kann, wie vorgeschlagen wurde ich ein NullMenuModule, die nichts tut, haben könnte, aber halten die Anwendung aus dem Brechen).
Allerdings wird die Anwendung, die ich erstelle, eine MenuManager-Klasse im MenuModule haben und jedes Modul muss alles, was es im Menü haben will, mit dem MenuManager registrieren. Allerdings möchte ich in der Lage sein, auszutauschen MenuModule z. haben eine InfragisticsMenuModule und haben eine TelerikMenuModule usw.
Allerdings, wenn ich beispielsweise in bin das CustomersModule, um TelerikMenuModule, zu verwenden, muss ich es verweisen. Und wenn ich InfragisticsMenuModule verwenden möchte, muss ich darauf verweisen.
Also wie kann ich TelerikMenuModule mit InfragisticsMenuModule "hot swap", ohne alle meine Module mit neuen Referenzen neu kompilieren, z. Ich möchte dies ersetzen:
Application.exe
Customers.dll
TelerikMenuModule.dll
mit diesem:
Application.exe
Customers.dll
InfragisticsMenuModule.dll
und einfach in der Lage, die Anwendung neu zu starten und es läuft mit der neuen InfragisticsMenuModule.dll und nicht beklagen, dass TelerikMenuModule.dll keine existiert länger. Diese
@Earwicker: aber wie würde ich dies implementieren, z. Wie kann ich "Register aufrufen"? Ich habe in der Unity-Dokumentation den Abschnitt "Gewusst wie: Füllen des Modulkatalogs aus einer Konfigurationsdatei oder einem Verzeichnis in WPF" gefunden, den ich durcharbeiten werde. –
Ja, das klingt wie das Richtige. –
Dies ist die richtige Technik. In Ihrer Shell registrieren Sie ein Objekt mit Ihrem Container, der IMenuSystem implementiert. "Client" -Module erklären einfach, dass sie ein IMenuSystem benötigen und Ihre Shell wird eine Implementierung einbringen, die über Infragistics Bescheid weiß oder über Telerik Bescheid weiß. Sie sollten nur jedes Modul benötigen, um auf eine "Contracts" -DLL zu verweisen, die nur Ihre Schnittstellendefinitionen enthält. Dies ist die 100% richtige Antwort. Wir machen das in unserem eigenen Projekt und es funktioniert großartig. –