Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Thomas Lebrun

Tout sur WPF, LINQ, C# et .NET en général !

Actualités

[MEF/Silverlight] Utiliser des services communs entre le Shell et les différents modules

Dans la lignée de mon post précédent (qui expliquait comment créer une application modulaire avec MEF et Silverlight), nous allons voir maintenant comment faire pour parvenir à utiliser des services qui soient communs au Shell (autrement dit à l’application qui héberge les plugins) et à ces fameux modules/plugins justement.

Tout d’abord, dans le projet qui est commun au Shell et aux modules, nous allons rajouter une interface IPopupService:

image

Ensuite, dans notre Shell, nous allons implémenter cette interface pour créer un service d’affichage de boites de dialogues:

   1: public class PopupService : IPopupService
   2: {
   3:     #region IPopupService Members
   4:  
   5:     public void ShowMessage(string msg)
   6:     {
   7:         MessageBox.Show(msg);
   8:     }
   9:  
  10:     #endregion
  11: }

Notre Shell principal utilisant Unity, nous allons enregistrer notre service dans le container Unity:

   1: instance.RegisterType<IPopupService, PopupService>();

Reste à vérifier maintenant que ce service fonctionne correctement dans notre Shell. Pour cela, dans le ViewModel principal, on va résoudre l’instance de notre service depuis le container Unity:

   1: var popupSvc = UnitySingleton.RootContainer.Resolve<IPopupService>();
   2: popupSvc.ShowMessage("Hello from MainPageViewModel");

A l’exécution, pas de mystères: la référence du service est correctement retrouvée dans le container Unity ce qui permet d’afficher la boite de dialogue:

image

A présent, il va falloir exposer ce service à nos différents modules. Et c’est là que MEF intervient ! On va commencer par exporter, via les attributs de MEF, l’implémentation de notre service:

   1: [Export(typeof(IPopupService))]
   2: public class PopupService : IPopupService

Puis, dans chacun de nos modules, on va importer (toujours via les attributs) ce service. A noter que cela est possible car l’interface IPopupService est définie dans le projet Core, qui est commun à tous les projets de la solutions (Shell + modules):

   1: [Import(typeof(IPopupService))]
   2: public IPopupService PopupSvc { get; set; }

Ensuite, il ne reste plus qu’à utiliser notre propriété qui sera correctement résout grâce à MEF:

   1: if (this.PopupSvc != null)
   2: {
   3:     this.PopupSvc.ShowMessage("Hello from WelcomePageViewModel !");
   4: }

Attention tout de même, pour que l’import puisse fonctionner, il est nécessaire d’appeler la méthode CompositionInitializer.SatisfyImports:

   1: CompositionInitializer.SatisfyImports(this);

Là encore, le résultat parle de lui-même !

image

 

Bonne composition à tous ! Wink

 

A+

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: jeudi 1 avril 2010 10:02 par Thomas LEBRUN
Classé sous : , , ,

Commentaires

gvinsot a dit :

Un peu de modularité ? avec une communication commune entre les modules silverlight ?

A voir :

http://www.millionid.com

# mai 21, 2010 15:48

dauphinus a dit :

Bonjour Thomas,

je débute avec MEF, et j'ai repris ton exemple pour en comprendre le fonctionnement, mais cela bug à l'exécution. Les pages ou j'ajoute l'import de PopupService n'apparaissent plus dans le menu a droite.

Et j'ai cette erreur dans la sortie du projet a l'exécution :

1) No valid exports were found that match the constraint '((exportDefinition.ContractName == "TL.Silverlight.Demos.Extensibility.Core.Interfaces.IPopupService") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "TL.Silverlight.Demos.Extensibility.Core.Interfaces.IPopupService".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))', invalid exports may have been rejected.

Resulting in: Cannot set import 'TL.Silverlight.Demos.Extensibility.Module2.DemoPage.PopupSvc (ContractName="TL.Silverlight.Demos.Extensibility.Core.Interfaces.IPopupService")' on part 'TL.Silverlight.Demos.Extensibility.Module2.DemoPage'.

Element: TL.Silverlight.Demos.Extensibility.Module2.DemoPage.PopupSvc (ContractName="TL.Silverlight.Demos.Extensibility.Core.Interfaces.IPopupService") --&gt;  TL.Silverlight.Demos.Extensibility.Module2.DemoPage --&gt;  AssemblyCatalog (Assembly="TL.Silverlight.Demos.Extensibility.Module2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")

J'ai ajouter CompositionInitializer.SatisfyImports dans le module, mais peut être pas au bon endroit. (j'ai lu que l'on pouvait l'appeler qu'une seule fois, et il est aussi appelé dans le constructeur de ModulesLoader() )

Pourrais-je avoir les sources du projet ?

Merci.

# juin 14, 2010 11:37

Thomas LEBRUN a dit :

Envoie moi un mail via la page de contact, je t'enverrais les sources ;)

# juin 14, 2010 13:42
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [SharePoint] Les sessions TechDays 2012… par Le blog de Patrick [MVP SharePoint] le il y a 6 heures et 55 minutes

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le 02-09-2012, 11:01

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le 02-09-2012, 08:28

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59