2010-01-22 8 views
1

Je suis nouveau à System.Action <T> et l'expression Lambda. Voici un cas que j'aimerais utiliser.Exemple d'expression Lambda avec System.Action <T> pour un cas MEF?

using System; 
using System.ComponentModel.Composition; 
public class MyClass { 
    public static CompositionContainer Container = new CompositionContainer(); 

    private void Initialize(Action<CompositonBatch> action) {} 

    public MyClass() { 
     CompositionBatch batch = null; 
     inititialize(x=> { 
      // create catalog instances: instance1 and instance2 as example 
      // ... 
      x.AddPart(instance1); 
      x.AddPart(instance2); 
      batch = x; 
     }); 
     // at this point, will be batch be none-null value will parts added? 

     // the following code is composing batch to the container 
     Container.Compose(batch); 
    } 
} 

Fondamentalement, la méthode initialize (action < l'action CompositionBatch >) est utilisé pour initialiser des composants de catalogue MEF à une instance CompositionBatch, qui ajoute toutes les parties à l'importation et à l'exportation. Après cela, le lot est composé dans le conteneur pour résoudre tous les mappages DI.

Je ne suis pas sûr si j'utilise System.Action <T> et l'expression Lambda correctement ici. X serait-il créé par Composition() CTOR à la volée dans cet exemple? Dois-je mettre quelque chose dans la méthode Initialize()? Ou devrais-je créer un délégué comme Initialize() à la place (si oui, je pense que j'ai encore besoin de le lier à une méthode)?

Répondre

1

Le problème ici est que vous n'invoquez jamais votre expression lambda. Pour ce faire, vous devez changer votre méthode Initialize() comme ceci:

private void Initialize(Action<CompositonBatch> action) {action(new Composition());} 

Notez maintenant comment vous appelez en fait la méthode que vous passez à la fonction. En outre, il y a une faute de frappe dans votre constructeur (intialize plutôt que Initialize) et je ne vois pas où instance1 et instance2 sont déclarés. Mais je ne suis pas sûr que vous gagniez vraiment quelque chose ici. Soyez également averti que cela va créer une fermeture sur la variable batch.

+0

J'ai édité mes codes. Je ne suis pas sûr de ce que vous voulez dire par «fermeture sur le lot var». Ma compréhension est que le lot n'est pas nul après l'appel de Initialize() et qu'il contient des parties. Voulez-vous dire que j'ai besoin de définir batch comme niveau de classe var? –

+0

J'ai eu une erreur avec action(); dans la méthode Initialize(). Ça devrait être quelque chose comme "action (nouvelle composition())"; au lieu? –

+0

Oui, ça devrait le faire. Je vais modifier ma réponse. –