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!