8
votes

Problème de composition du MEF

Je ne peux pas résoudre ce qui semble être un problème de base de la MEF: J'ai 2 "plugins" (que nous appellerons P1 et P2) et un troisième projet commun aux deux plugins (que nous allons appeler c). P1 et P2 Référence C.

Lorsque vous essayez d'importer un composant qui vit dans P1, il échoue car ce composant a des dépendances sur les composants qui vivent en c. P>

Voici la trace: p >

System.componentmodel.comPosition Avertissement: 1: la composablePartDefinition 'myCompany.client.pms.plugin.client.pms.viewmodel.inclusionListViewModel' a été rejetée. La composition reste inchangée. Les modifications ont été rejetées en raison des erreurs suivantes: la composition produite plusieurs erreurs de composition, avec 4 causes profondes. Les causes profondes sont fournies ci-dessous. Examinez la propriété CompositionException.Errors pour des informations plus détaillées. P>

1) aucune exportation n'a été trouvé correspondant à la contrainte forte> '((exportDeFinition.Contractname = "mycompany.client.plugins.commeux.controls.electors.commoselectors.viewmodel.icalypsobookselectorviewmodel") && (ExportDefinition .Metadata.Containskey ("exportySpeIdentity") && "mycompany.client.plugins.commeux.controls.electors.commoselectors.viewmodel.icalyypsobookselectorviewModel" .Equals (exportationDefinition.metadata.get_item ("exporttypeIdentity"))) '. P >

résultant: impossible de définir Importer 'myCompany.client.pms.plugin.client.pms.plugin.inclusionlist.viewmodel.calypeListViewModel.CalyPsObookSelectorViewModel (Contractname = "mycompany.client.plugins.commeux.Controls.selectors.mon.controls.Su Partie 'myCompany.client.pms.plugin.inclusionlist.viewModel.InclusionListViewModel'. Elément: mycompany.client.pms.plugin.inclusionlist.viewModel.InclusionListViewModel.CalypsobookselectorLeViewModel (Extractname = "Mycompany.client.plugins.commeux.Controls.selectors.Guet .InclusionList.ViewModel.InclusionListviewModel -> DirectoryCatalog (Path = "C: \ Work \ MMTrader \ Dashboard \ Code \ SRC \ Dashboard \ mm \ Trader \ Bin \ Débogin \ Positions") P> blockQuote>

[...] (les 3 autres problèmes sont exactement les mêmes, sur différents modèles de vue) P>

J'ai regardé le catalogue du MEF, et il s'avère que le MEF sait que Ceux-ci voient des modèles, donc je ne sais pas ce qui manque. P>

Comme demandé par Dennis ci-dessous, voici mon importation / export: P>

Exporter: P>

[Import(typeof(ICalypsoBookSelectorViewModel))]
public ICalypsoBookSelectorViewModel CalypsoBookSelectorViewModel { get; set; }


0 commentaires

4 Réponses :


6
votes

Votre p1 importe quelque chose à partir de C (plus précisément, iCalypsobookookselectorviewModel ).

Lorsque le conteneur MEF tente de créer p1 , il essaie également de résoudre toutes les importations, que p1 dépend de. Par conséquent, il effectue la recherche d'exportation de iCalyPsobookSelectorViewModel (en effet, nom du contrat, mais cela n'a pas d'importance dans ce cas) dans son propre catalogue et ses fournisseurs d'exportation parent.

Si une telle exportation n'est pas trouvée (ceci est votre cas), le conteneur MEF reste la composition inchangée.
Pour résoudre ce problème, vous devez ajouter [exporter (typeof (iicypsobookookectorviewmodel))] à la définition de type correspondante.

Bien sûr, tout cela implique que votre catalogue et vos fournisseurs d'exportation ( S'il y en a des) sont initialisés correctement.

Remarque, que ces définitions d'exportation sont non pas égales: xxx


6 commentaires

Bonjour Dennis, merci beaucoup pour votre réponse! Le problème est que l'exportation est correctement définie sur la classe d'implémentation: [Exportation (typeof (iCalyPsobookookectorviewmodel))] Calypsobookookselector publicViewModel: ScreenwithCleanuplifeCycle, iCalypsobookookselectorViewModel


Salut encore, j'ai regardé votre réponse éditée et je comprends tout cela: je crois que mes attributs d'importation / exportation sont corrects, ils définissent correctement l'interface, etc. D'autre part, il semble que le MEF soit un peu menant à moi Je commence à penser que le problème n'est pas directement avec mon iCalypsobookookselectorViewModel, mais avec une autre importation beaucoup sur la ligne (dont le MEF ne me dit pas). Je reviendrai à vous si ce plomb mène quelque part


Je viens d'ajouter l'importation / exportation vers la question initiale


@Antoinejaussoin: vos définitions d'importation / exportation sont ok. Pourriez-vous poster des pièces du catalogue, utilisé dans le conteneur MEF (par exemple, une capture d'écran de débogueur)? Je ne crois pas aux miracles ...


J'ai posté la capture d'écran sur la question initiale. Je ne crois pas aux miracles non plus que cela pourrait être mon jour de chance;)


J'ai trouvé le problème, il n'avait bien sûr rien à voir avec les composants du modèle de vue ... Mef n'est pas très utile pour le débogage. Je posterai ma découverte dans une réponse séparée.



9
votes

J'ai enfin trouvé le problème et cela n'avait rien à voir avec le CalypsobookookectorviewModel que MEF pointait le doigt.

En effet, la viewModel a des dépendances sur un autre composant (un Calypsobookookelectorel), qui a à son tour une dépendance sur Un composant IDISPATCHER. P>

Le problème était que ce composant IDISPATCHER, qui a été spécifié avec un nom de contrat (voir ci-dessous), a été exporté deux fois fort> (une fois dans chaque plugin). ne pouvait pas dire lequel utiliser. Le vrai problème est que Mef aurait dû me dire que fort>, au lieu de pointer le doigt sur une classe deux niveaux de la chaîne. P>

Merci Dennis pour avoir examiné le problème, Et j'espère que cela aidera les autres personnes qui vont avoir le même problème. P>

Le répartiteur Importation: P>

[Import(DispatcherNames.BackgroundDispatcherName, typeof(IDispatcher))]
public IDispatcher Dispatcher { get; set; }


9 commentaires

Voulez-vous marquer cela comme la bonne réponse? J'ai commencé à regarder mef récemment, ce qui est une information utile!


Je voudrais, mais je ne peux pas avant deux jours apparemment. Je ferai cela dans 48 heures à moins que quelqu'un puisse le faire pour moi avant alors!


@Antoinejaussoin: Mais Mef vous dit à ce sujet! :) Regardez attentivement dans votre fenêtre de sortie et vous verrez quelque chose comme «plus d'une exportation a été constaté que correspond à la contrainte» lors de la construction de cette pièce (selon IDISPATCHER ). Bien sûr, si cette partie n'est pas composée, selon les pièces ne sera pas également construite. Malheureusement, je ne sais pas comment poster des échantillons de code ici pour reproduire ce message.


@Dennis: J'ai regardé à nouveau sur le journal, et la seule chose que je pouvais trouver était System.ComponentModel.comPosition Informations: 6: la composablePartDefinition 'mycompany.dashboard.client.plugins.comment.plugins.commeux dewramework.idispat cher' a été ignoré parce qu'il ne contient aucune exportation. Le problème est que c'était au milieu de beaucoup d'autres choses, et à moins que je ne connaissais au premier endroit que l'Idispatcher était le problème, je n'aurais pas pu l'avoir trouvé!


Il se peut que nous utilisions une ancienne version de Mef, je vais jeter un coup d'œil à la mise à jour. Peut-être qu'une version plus récente donnerait plus d'informations de débogage.


@Antoinejaussoin: J'utilise Mef à partir de .NET 4. Il est intéressant de regarder la trace complète MEF (comment l'activer: blogs.msdn.com/b/dsplisetted/archive/2010/07/13/... ).


Alors, comment évitez-vous cette question à long terme?


J'ai aussi le même problème mais je n'ai pas pu trouver Disternernames.BackgroundDispatTrame. Qu'est-ce que c'est ?


L'erreur OCURC parce qu'il utilise [Import], pour importer plus d'un que vous devriez utiliser [Importmany]



0
votes

L'erreur OCROC, car il utilise [Import] , pour importer plus d'un que vous devez utiliser [importateur>


0 commentaires

0
votes

J'ai cherché la solution à ce problème après que je suis arrivé. J'ai réalisé que j'utilisais System.comPosition au lieu d'utiliser System.componentModelCosition sur la classe Exportation.


0 commentaires