2010-12-14 71 views
1

Je souhaite créer un module WPF ou Silverlight qui peut non seulement être utilisé par le bootstrappeur de Shell, mais aussi incorporé dans des applications non prismatiques. Applications PRISM.Comment créer un module WPF/Silverlight à l'aide d'un prisme, mais aussi incorporé dans des applications sans prisme

En bref, y a-t-il un moyen d'initialiser le module PRISM à partir du module plutôt que de l'initialiser à partir de Shell? L'objectif d'Ulimate est d'avoir un module PRISM WPF/Silverlight, qui peut être initialisé par des applications non-PRISM.

Répondre

2

Il n'y a aucun obstacle à cela. L'interface IModule a une seule méthode void sans paramètre: Initialize().

Une application sans prisme peut initialiser le module en appelant cette méthode. C'est tout.

Si l'autre application dispose d'un système de plug-in différent, avec une autre interface, le module peut implémenter cette interface ainsi, et le corps de toute méthode d'initialisation qui interface uses peuvent simplement appeler Initialize(), ou vice versa.

Par exemple:

public interface IMyPluginModule 
{ 
    void StartModule(); 
} 

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

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

Mais comment le module pourrait-il obtenir un handle de UnityContainer, RegionManager ou EventAggregator à partir d'une application sans prisme ou dois-je en créer un si le handle est null? – dev999

+1

Je ne suis pas sûr de comprendre ce que vous entendez par "obtenir un handle", mais cela dépendra de si cette autre application non-prisme utilise l'une de ces choses. Si votre module est conçu pour traiter 'IUnityContainer', par exemple, mais que l'autre application utilise Castle Windsor, vous voudrez probablement créer une nouvelle implémentation' IUnityContainer' qui délègue tous ses appels à Windsor. Même chose avec 'IRegionManager'. Alternativement, vous concevez le module avec une couche supplémentaire d'abstraction pour déléguer DI, gestion de vue, agrégation d'événements, etc., au lieu de consommer des composants de prisme. – Jay

+0

Ce que j'ai essayé de faire est votre approche alternative que vous avez suggérée. Mais en quelque sorte initialiser IUnityContainer et IRegionManager à partir de IModule ne semble pas fonctionner pour moi. J'ai configuré le conteneur et toutes les autres choses qui sont mentionnées dans boostrapper typique, mais je ne sais pas comment ajouter dynamiquement des régions à partir du code avec le conteneur (de non-prisme) passé à module intialiser. J'ai utilisé RegionManager.SetRegionName (conteneur, "MainControlRegion"); RegionManager.UpdateRegions(); mais cela ne semble pas aider – dev999

1

Il est un peu plus compliqué qu'il n'y paraît au premier abord, mais il est faisable. Je ne sais pas si vous utilisez Prism 4 encore, mais si oui, Microsoft fournit effectivement des conseils pour ce scénario:

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

Il y a un peu de manipulation de projet, vous devez faire pour obtenir deux projets en cours d'exécution cote à cote. Il y a un exemple inclus avec Prism v4 appelé "MultiTargeting" si vous avez besoin de voir un échantillon de travail.

Votre question concernant l'autorisation de l'initialisation d'un module par lui-même, plutôt que d'avoir le shell/bootstrapper orchestrant est une mauvaise approche, cependant. Essentiellement ce que vous auriez serait deux coquilles ... un WPF et un Silverlight. Jetez un oeil sur les échantillons et voyez ce que vous en pensez.

Espérons que cela aide.