2011-06-22 3 views
1

Je rencontre un problème avec l'extension d'un code C# existant.MEF [Importer] C# Exemple

Il existe une instance d'une classe de gestionnaire exportée à partir d'une classe. Il est importé avec succès dans plusieurs autres classes en utilisant:

[Import] 
private Manager manager = null; 

J'ai ajouté le même code à une nouvelle classe. Il compile bien, mais à l'exécution, la référence est toujours nulle.

Il me manque évidemment quelque chose.

Ce que j'aimerais vraiment voir, c'est le code minimum (deux classes) nécessaire pour faire une importation. Il ne doit rien faire sauf créer et exporter un objet (de préférence pas une chaîne ni une valeur simple) dans une classe et montrer qu'il est non nul lorsqu'il est importé dans une autre classe. (Je me suis perdu dans les détails d'autres exemples essayant de montrer la fonctionnalité plutôt que juste une syntaxe utilisable.)

Veuillez noter que j'ai besoin de voir un exemple en utilisant [Importer], pas [Importer (type)] .

Merci.

+0

Si la réponse que j'ai fournie est suffisante, vous devez la marquer comme réponse ... juste un FYI :) –

Répondre

4

Je suis assez sûr que cela fonctionnera:

public class SampleClass 
{ 
    [Import] 
    private Manager manager; //Setting it to null is redundant. 
} 


[Export] 
public class Manager 
{ 
} 

Vous aurez également besoin de configurer votre conteneur. Il y a des cadres qui facilitent le tout, mais sinon. Il est pas difficile:

Au début de votre application, vous devrez remplir votre catalogue:

//http://mef.codeplex.com/wikipage?title=Using%20Catalogs 
var catalog = new AggregateCatalog(); 

//Add AssemblyCatalogs (Single) or DirectoryCatalogs (Multiple) 
catalog.Catalogs.Add(new AssemblyCatalog(typeof(IManager).Assembly)); 
catalog.Catalogs.Add(new DirectoryCatalog(@"myimports\")); 

//Don't do this (including the same assembly twice) 
//catalog.Catalogs.Add(new AssemblyCatalog(typeof(Manager).Assembly)); 

var container = new CompositionContainer(catalog); 
container.composeParts(this); 

Mais, vous devriez vraiment tirer parti des interfaces pour l'importation/exportation.

public class SampleClass 
{ 
    [Import] 
    private IManager Manager; 
} 

[InheritedExport] 
public interface IManager { } 

public class Manager : IManager { } 

Maintenant, jusqu'à dire un nom et le type, ce n'est pas nécessaire, mais il est bon si vous envisagez d'avoir des exportations semblables que vous avez besoin de faire la distinction.

public class SomeClass 
{ 
    //This is for the specific AdvancedManager 
    [Import("AdvancedManager", typeof(IManager))] 
    private IManager AdvancedManager; 

    //This is for the specific SimpleManager 
    [Import("SimpleManager", typeof(IManager))] 
    private IManager SimpleManager; 

    //If you don't mark it as ImportMany this will fail because now there 
    //are 2 non-specific IManager exports. 
    [ImportMany] 
    private ICollection<IManager> AllManagers; 
} 

[InheritedExport] 
public interface IManager { } 

//This will export out as an IManager and a specifically named IManager 
[Export("AdvancedManager", typeof(IManager))] 
public class AdvancedManager : IManager { } 

//This will export out as an IManager and a specifically named IManager 
[Export("SimpleManager", typeof(IManager))] 
public class SimpleManager : IManager { } 
+1

Bonne réponse, mais je ne suis pas sûr de ce qu'est PackageCatalog et les choses liées. Cela ne fait pas partie du MEF. Dans une version d'aperçu de MEF pour Silverlight, nous avions un PackageCatalog, mais il s'appelle maintenant DeploymentCatalog et les API ont quelque peu changé. –

+0

Je n'ai pas pu trouver PackageCatalog dans le projet. Bon à savoir ça a changé. Je vois DirectoryCatalog, AssemblyCatalog et AggregateCatalog dans le projet. J'essaie toujours de comprendre. –

+0

Ah oui, désolé ... AggregateCatalog (une collection d'autres catalogues), DirectoryCatalog (importe les assemblages d'un répertoire), AssemblyCatalog (importe un seul assembly). Désolé pour ça. –

-1

Le gestionnaire doit être une propriété. essayez [Import] private Manager manager { get; set; }

Questions connexes