[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:
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:
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 !

Bonne composition à tous ! 
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 :