2010-12-14 9 views
1

Ich möchte ein WPF- oder Silverlight-Modul erstellen, das nicht nur von Shells Bootstrapper verwendet werden kann, sondern auch in nicht-prismatische Anwendungen eingebettet werden kann. PRISM-Anwendungen.Wie man WPF/Silverlight-Module mit Prismen erstellt, aber auch in Nicht-Prismen-Anwendungen eingebettet werden kann

Kurz gesagt gibt es eine Möglichkeit, PRISM-Modul von Modul selbst initialisiert werden, anstatt von Shell initialisieren?

Ultimate Ziel ist das WPF/Silverlight PRISM-Modul, das von Nicht-PRISM-Anwendungen initialisiert werden kann.

Antwort

2

Es gibt kein Hindernis dafür. Die IModule Schnittstelle hat eine einzige, parameterlose void Methode: Initialize()

Eine Nicht-Prism-Anwendung kann das Modul durch Aufruf dieser Methode initialisieren. Das ist es.

Wenn die andere Anwendung ein anderes Plugin-System, mit einer anderen Schnittstelle kann das Modul diese Schnittstelle implementieren sowie und den Körper wie auch immer Initialisierungsmethode, die Schnittstelle Anwendungen einfach Initialize() nennen können, oder umgekehrt.

Zum Beispiel:

public interface IMyPluginModule 
{ 
    void StartModule(); 
} 

public class MyModule : IModule, IMyPluginModule 
{ 
    public void Initialize() 
    { 
     // actual initialization code here 
    } 

    public void StartModule() 
    { 
     Initialize(); 
    } 
} 
+0

Aber wie würde Modul ein Handle von UnityContainer, RegionManager oder EventAggregator von Nicht-Prism-Anwendung bekommen oder muss ich eine erstellen, wenn das Handle Null ist? – dev999

+1

Ich bin mir nicht sicher, ob ich verstehe, was Sie mit "Griff" meinen, aber es hängt davon ab, ob diese andere, nicht prismatische Anwendung eines dieser Dinge verwendet. Wenn Ihr Modul zum Beispiel mit "IUnityContainer" arbeiten soll, aber die andere Anwendung Castle Windsor verwendet, möchten Sie wahrscheinlich eine neue "IUnityContainer" -Implementierung erstellen, die alle Aufrufe an Windsor delegiert. Gleiches mit "IRegionManager". Alternativ entwerfen Sie das Modul mit einer zusätzlichen Abstraktionsebene, um DI, Ansichtsverwaltung, Ereignisaggregation usw. zu delegieren, anstatt Prism-Komponenten zu verbrauchen. – Jay

+0

Was ich versucht habe, ist Ihr alternativer Ansatz, den Sie vorgeschlagen haben. Aber irgendwie Initialisierung von IUnityContainer und IRegionManager aus IModule scheint nicht für mich zu arbeiten. Ich habe den Container und alle anderen Dinge konfiguriert, die in einem typischen Boograpper erwähnt werden, aber ich weiß nicht, wie man dynamisch Regionen aus dem Code mit dem Container (ohne Prisma) hinzufügt, der an den Modul-Initialisierer übergeben wurde. Ich habe RegionManager.SetRegionName (Container, "MainControlRegion"); RegionManager.UpdateRegions(); aber das scheint nicht zu helfen – dev999

1

Es ist ein wenig komplizierter, als es auf den ersten Blick erscheint, aber es ist machbar. Ich weiß nicht, ob Sie Prism verwenden 4 noch nicht, aber wenn ja, Microsoft bietet tatsächlich Anleitung für dieses Szenario:

http://msdn.microsoft.com/en-us/library/ff921109(v=PandP.40).aspx

Es ist ein bisschen Projekt Manipulation Sie tun müssen, um zwei Projekte zum Laufen zu bringen Seite an Seite. Es gibt ein Beispiel für Prism v4 mit dem Namen "MultiTargeting", wenn Sie ein funktionierendes Beispiel sehen müssen.

Ihre Frage, ob ein Modul initialisiert werden kann, anstatt den orchestrierenden Shell/Bootstrapper zu verwenden, ist jedoch der falsche Ansatz. Im Wesentlichen würden Sie zwei Schalen haben ... ein WPF und ein Silverlight. Schauen Sie sich die Beispiele an und sehen Sie, was Sie davon halten.

Hoffe, das hilft.