2010-04-19 9 views
4

Lorsque je tente de le faire:avec des exportations de biens MEF PartCreationPolicy

[Export(typeof(IMyService))] 
[PartCreationPolicy(CreationPolicy.Shared)] 
private MyService Service 
{ 
    get 
    { 
     var service = new MyService(); 
     service.Configure(); 
     return service; 
    } 
} 

je reçois une erreur de compilation: Attribute 'PartCreationPolicy' is not valid on this declaration type. It is only valid on 'class' declarations.

Est-ce un bug? Je ne vois pas pourquoi le MEF autoriserait les exportations de propriétés mais ne permettrait pas de spécifier la durée de vie de la pièce.

Utilisation de VS2010 RC.

+0

Question: Dans quel assemblage PartCreationPolicy est-il situé? – Shimmy

Répondre

7

PartCreationPolicy doit aller sur la classe, même si l'exportation va sur la propriété. La classe est ce qui correspond à la partie, et la politique de création contrôlera si MEF crée une nouvelle instance de la classe chaque fois qu'une exportation lui est demandée ou non.

Je ne suis pas sûr si vous souhaitez utiliser Shared ou NonShared. Le fichier CreationPolicy est défini sur Shared dans votre exemple de code, mais vous créez ensuite une nouvelle instance de MyService dans votre accesseur de propriété. Cela semble indiquer que vous cherchez peut-être une politique de création de NonShared.

Si vous souhaitez qu'un nouveau service soit créé chaque fois qu'une exportation est demandée, vous devez le faire via la politique de création, et non en créant une nouvelle instance dans le getter. La valeur d'une exportation n'est pas censée changer au moment de l'exécution, et en fait MEF n'appellera qu'une seule fois le getter, et stockera la valeur de retour quand il aura à nouveau besoin d'accéder à la valeur exportée. Donc, créer une nouvelle instance dans votre getter peut donner l'impression qu'il y aurait plusieurs services créés alors qu'il n'y en aura qu'un seul.