2

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

Antwort

5

ist, wo Schnittstellen kommen in Sie müssen so etwas wie:.

public interface IMenuSystem 
{ 
    // whatever operations need to be offered by a menu system 
} 

Application.exe und Customers.dll nur auf diese Schnittstelle beziehen. Sie dürfen nicht über eine bestimmte Implementierung informiert werden.

Dann würden Sie Konfigurationsschritte (Aufruf Register... Methoden oder Verwendung einer Konfigurationsdatei) verwenden, um anzugeben, welcher Typ die Implementierung von MenuSystem bereitstellen wird.

+0

@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. –

+0

Ja, das klingt wie das Richtige. –

+2

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. –

2

Aus naheliegenden Gründen kommt MEF hier in den Sinn und ist für solche Dinge gedacht. Ich hatte keine Möglichkeit, Unity zu verwenden, daher bin ich mir nicht sicher, ob es so etwas eingebaut hat (d. H. Ein Verzeichnis für eine IMenuModule-Implementierung durchsucht), aber MEF kann dies tun.

Vorschlag ist auch, dieses IMenuModule in einer allgemeinen Versammlung (getrennt von Ihrer anderen Versammlung) zu setzen. Ich habe diese Sache gewöhnlich Something.Core.dll genannt.

Sie könnten also: Application.exe, Customer.dll, Application.Core.dll und Ihre spezifische MenuModule-Implementierung.

Ihre spezifische MenuModule-Implementierung verweist auf die Application.Core-Assembly, um Zugriff auf die IMenuModule-Schnittstelle zu erhalten und sie dort zu implementieren.

+0

das macht Sinn, also Sie sagen: (1) machen Application.Core.dll mit IMenuModule, (2) machen InfragisticsMenuModule mit "MenuModule: IMenuModule" und harte Referenz Application.Core.dll und (3) in Customers.dll einen harten Verweis auf Application.Core.dll? Gibt es irgendeinen Grund, warum Sie Application.Core überhaupt haben und nicht alle Ihre Interfaces selbst in die Anwendung stellen? –

+0

Es ist nur aus Gewohnheit :). Sie könnten es in Anwendung selbst setzen, wenn Sie möchten. –

+0

das funktioniert gut, bis ich mein Objekt registrieren muss: container.RegisterType (neuer ContainerControlledLifetimeManager()) ;, dann muss ich einen harten Verweis auf das InfragisticsModule haben. –

Verwandte Themen