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

elmer59 a dit :

Bonjour j'ai le même souci je partage une interface via un projet commun entre le shell et les modules,j'arrive à importer exporter entre les modules,mais pas d'un module vers le shell ?

erreur au chargement de la view shell.

l'import est de type

import(Typeof(ITest))

ITest toto;

exportDefinition.Metadata.ContainsKey("ExportTypeIdentity")

Une Idée,

D'avance merci

# avril 21, 2012 09:43
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01