Blog de Julien Dollon (MVP)

Consultant / Formateur .NET

Julien Dollon

Consultant/formateur .NET pour I'FORM/Exakis et Full Professor SUPINFO.

Responsable de la communauté Dotnet-France ainsi que nommé Most Valuable Professional, je participe activement à la communauté Microsoft.

 

 

Mon CV de Consultant/Formateur .NET

Mon Transcript de Formateur .NET

 


 
 
 
 
Official INETA Logo
 
IForm

[Silverlight3] Support de MEF Preview 6

blocks

Il y a peu je vous ai écrit un petit article sur la CLR 4.0 ainsi que MEF.

MEF c’est la possibilité de créer des applications “composites” en .NET.

Ce framework est disponible dans la quasi-totalité des templates .NET (WPF, Winforms …) mais il n’existait pas pour Silverlight.

C’est maintenant chose faite grâce à la version Preview 6 disponible ici.

Pour le moment il n’existe que le PackageCatalog (on télécharge des .xap qu’on inclut à notre shell principal) mais le DirectoryCatalog sera bientôt disponible !

Faire du MEF avec Silverlight:

mefsv1

Nous avons des applications Silverlight (.xap) avec un shell principal qui affichera les autres UserControls.

Au niveau du code, il faut créer un PackageCatalog et télécharger les modules représentés par des .xap.

   1: private CompositionContainer _container;
   2: private AggregateCatalog ac;
   3: private PackageCatalog pc;
   4:  
   5: public MainPage()
   6: {
   7:     ac = new AggregateCatalog();
   8:     pc = new PackageCatalog();
   9:     ac.Catalogs.Add(pc);
  10:     _container = new CompositionContainer(ac);
  11:  
  12:     Views = new ObservableCollection<Lazy<IModule>>();
  13:  
  14:     InitializeComponent();
  15:  
  16:     Views.CollectionChanged += new NotifyCollectionChangedEventHandler(Views_CollectionChanged);
  17:  
  18:     Package.DownloadPackageAsync(new Uri("Module1.xap", UriKind.Relative), completed);
  19:     Package.DownloadPackageAsync(new Uri("Module2.xap", UriKind.Relative), completed);
  20: }
  21:  
  22: private void completed(AsyncCompletedEventArgs e, Package p)
  23: {
  24:     if (!e.Cancelled && e.Error == null)
  25:     {
  26:         pc.AddPackage(p);
  27:         CompositionBatch batch = new CompositionBatch();
  28:         batch.AddPart(this);
  29:         batch.AddExportedValue<CompositionContainer>(_container);
  30:         _container.Compose(batch);
  31:     }
  32: }
  33:  
  34: void Views_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
  35: {
  36:     this.stack.Children.Clear();
  37:     foreach (Lazy<IModule> view in Views)
  38:         this.stack.Children.Add(view.Value as UserControl);
  39: }
  40:  
  41: [ImportMany(AllowRecomposition = true)]
  42: public ObservableCollection<Lazy<IModule>> Views { get; private set; }

Vous pouvez télécharger mon exemple ici.

Posted: Jul 15 2009, 03:57 by juliend | Comments (9) RSS comment feed |
  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Filed under: .NET | WPF/Silverlight | Général

Comments

julienc said:

Alors ça c'est cool !

# July 15 2009, 16:19

Anael said:

Enfin!
Bonne nouvelle :]
Merci pour l'info

# July 16 2009, 03:58

Nk54 said:

Une question peut être bête Smile mais je demande quand même : si je fais un clic droit installer cette application, Silverlight va t il télécharger tout les xap ? Ou juste celui du shell ? ^^

Juste comme ça ... :p

Et je vois pas comment il va faire sans DirectoryCatalog. Ou alors j'ai pas compris à quoi servait DirectoryCatalog.

Je vais quand même implémenter ta solution ! S'il faut attendre quelque mois pour avoir une solution, mes utilisateurs s'en contenteront ! ^^

Bon billet Smile

# November 03 2009, 00:23

Nk54 said:

Et à ton avis, MEF 6, 7 ou 8 ?

# November 03 2009, 00:27

Nk54 said:

Et encore une dernière question (désolé c'est pas moi le pro :p) sais tu s'il est possible d'avoir un xap qui encapsule d'autre xap ? Par exemple module1 deviendrait une solution au lieu d'un projet (idem pour module2 etc)

Ensuite la solution module1 contiendrait un projet
sousModule1, un autre projet sousModule2 etc.

Je demande pour plusieurs choses : réduire le chargement de la solution au démarage de visual studio hihihi (parce qu'une fois 8modules, 1 projet service wcf, un projet de config pour les merge quand on fait de l'exportation pdf, etc etc etc. Visual studio peine au lancement :p

Et en plus ça permettrait de réduire encore le poids des xap et donc d'accélérer le chargement d'un module !

J'ai pas encore pris en main MEF c'est pour ça que j'aimerai ton avis Smile

Merci encore !

# November 03 2009, 01:04

juliend said:

Pour MEF: prend la dernière version compatible Silverlight
Toujours pour MEF: au même titre que l'assembly caching j'ai peur que MEF ne fonctionne pas en mode déconnecté (clic droit, installer...) il faut tester!
Le catalog se rempli grâce à "Package.DownloadPackageAsync(new Uri("Module1.xap");" ce qui implique de connaître le nom des XAP que tu charges. Mais ce n'est qu'une bêta, ce sera modifié rapidement.
Pour finir, oui, tu peux avoir un xap qui nécessite un autre xap si à chaque fois tu réimplemente MEF dans le sous xap.

Voili voilou

# November 03 2009, 01:51

Nk54 said:

C'est compliqué hein ^^

Snif j'ai pas été notifié de ta réponse. Je test dès que j'ai le temps d'implémenter MEF et d'essayer si ça marche out of browser. Mais de mémoire je crois que l'assembly caching ne va pas avec l'out of browser Frown

Je viens à l'instant de faire une recherche :
"Silverlight 3 Assembly Caching doesn't work in combination with Out of Browser (OOB) feature, and in that case you can use Isolated Storage as a dll cache mechanism."
J'ai pas compris pour l'isolated storage ^^ car il y a un isostore en OOB et In Browser.

Prochain challenge : persuader mon patron que l'out of browser n'est pas forcément des plus utiles : (autant partir sur wpf dans ce cas :p) et c'est pas les arguments qui manquent.

Ainsi j'aurais le loisir d'être payé à implémenter MEF & l'assembly caching ! mdr

As tu déjà trouvé des scénario où le OOB est vraiment utile ? Car à part l'implémentation du clic droit, je vois pas l'apport (peut être que les utilisateurs ne se rendent pas compte qu'ils sont sur internet) mais pas d'accès fichier, pas de DOM ...

Bonne journée et encore merci du temps que tu prends pour me répondre Embarassed

# November 04 2009, 20:27

juliend said:

Bonjour NK,
Le OOB est très pratique si jamais tu n'as pas prévue d'utiliser le système (fichiers, hardware, OS) du client.
Cela permet d'avoir un logiciel "légé" mais riche côté client qui de plus peut être hébergé sur une page web.
Tu sais, 90% des applications de gestion de données n'ont pas besoin de la puissance de WPF!

# November 04 2009, 23:27

Nk54 said:

Le library caching est énorme :O je pensais pas que mon fichier Xap passerait de 1100Ko à 335 Ko !!! Je suis bluffé !

Bon ok il faut toujours télécharger une première fois les dll. Mais bon, dès la deuxième visite on accède à l'appli 3 fois plus vite ! Énorme ! Et rien ne m'empêche de temps en temps à repasser en mode OOB, compiler et mettre le xap avec un lien sur ma page d'accueil "version.exe" enfin tu me comprendras.

Demain j'implémente MEF ! (si mon patron ne me met pas sur autre chose lol) merci JD ! Je biche trop grâce à toi car même sur clé 3g ça charge très vite maintenant ! Laughing

# November 05 2009, 02:33

Add comment




  Country flag

biuquote
  • Comment
  • Preview
Loading

captcha

*