2017-10-04 3 views
0

Je passe au noyau .net et tente de migrer mon code MEF de structure héritée vers le nouveau Microsoft Composition (MEF 2) (Microsoft.Composition 1.0.31)..net core MEF 2 Stratégie de création NonShared

Nous avons plusieurs classes dont la politique de création est "NonShared". Je suis en train coincé sur la façon dont j'appliquer l'attribut suivant à l'aide 2 avec noyau MEF .net:

[PartCreationPolicy(CreationPolicy.NonShared)] 

Est-ce que quelqu'un sait ce que le noyau .net 2 équivalent MEF est pour définir l'attribut ci-dessus pour « NonShared »?

Répondre

1

Depuis que 2 MEF a été porté sur .NET de base, nous avons seulement accès à des types au sein System.Composition et non ceux System.ComponentModel.Composition. Par conséquent, il n'est pas possible de définir cet attribut comme vous le feriez avec MEF 1.

Vous pouvez toutefois définir la stratégie de création de pièce pour chaque exportation définie via l'API.

Puisque nous sommes près de Halloween, nous allons supouse nous avons ces classes:

abstract class Monster { } 

class It : Monster { } 

class Zombie : Monster { } 

class Wife : Monster { } 

Dans MEF 2, vous devez créer un ConventionBuilder pour defeine vos exportations, comme ceci:

var rules = new ConventionBuilder(); 
      rules.ForTypesDerivedFrom<Monster>() 
       .Export<Monster>(); 

La partie intéressante ici est que, par défaut, une politique de création non partagée est appliquée, donc pas besoin de l'attribut. Testons:

var config = new ContainerConfiguration() 
       .WithAssemblies(new[]{ typeof(Monster).GetTypeInfo().Assembly}, rules); 

var container = config.CreateContainer(); 
var monsterA = container.GetExports<Monster>().First(); 
var monsterB = container.GetExports<Monster>().First(); 
Console.WriteLine(monsterA == monsterB); 

Maintenant, puisque par défaut, nous n'imposons pas le partage de nos exportations cela écrire sur la console Faux.

Afin de faire respecter le partage, nous ajoutons simplement .Shared() aux méthodes chaîne après .EXPORT comme ceci:

rules.ForTypesDerivedFrom<Monster>() 
       .Export<Monster>() 
       .Shared(); 

Et si nous courons à nouveau le test que nous allons obtenir vrai depuis maintenant les deux instances pointent vers la même référence.

Pour composer des pièces que vous feriez quelque chose comme ceci:

class TerrorContainer 
    { 
     [ImportMany] 
     public IEnumerable<Monster> Monsters { get; set; } 
    } 

Et où que vous composez-vous écririez:

var terrorContainer = new TerrorContainer(); 
    container.SatisfyImports(terrorContainer); 

Hope this helps!