2010-05-22 6 views
1

J'écris un outil qui communique avec plus d'un système de contrôle de version, subversion ou clearcase, et dispose de divers utilitaires qui peuvent être branchés dessus. Je pensais à utiliser MEF pour charger les fournisseurs de contrôle de version, et les utiilities, dont les deux ont des interfaces définies pour eux.Système de plugins C# robuste

J'ai commencé à utiliser MEF pour cela. Mais si le chargement d'un plugin échoue (sur la moitié des machines de mes clients, les liaisons ClearCase COM ne seront pas présentes, donc le chargement échouera, SVN ne sera pas installé, donc le plugin SVN ne se chargera pas), MEF lance une exception et aucun plugin ne fonctionne; J'espérais que le reste des plugins se chargerait.

[ImportMany(AllowRecomposition = true)] 
    public IEnumerable<IVersionControl> RegisteredProviders { get; private set; } 

Au lieu de cela, le cas échéant les fournisseurs ne parviennent pas à se construire, alors RegisteredProviders est nulle. Y at-il un moyen simple de configurer MEF pour y parvenir (signaler des exceptions mais charger d'autres instances), ou dois-je changer l'interface pour retarder leur échec d'initialisation jusqu'à ce que MEF ait instancié les objets?

Répondre

2

Cela dépend exactement du moment où l'exception est levée. Vous pouvez être en mesure d'obtenir ce que vous voulez en changeant votre importation à ceci:

[ImportMany(AllowRecomposition = true)] 
public IEnumerable<Lazy<IVersionControl>> RegisteredProviders { get; private set; } 

qui pourrait retarder l'exception jusqu'à ce que vous accédez à la propriété Valeur du paresseux.

Il est peut-être préférable d'écrire vos fournisseurs de contrôle de version afin qu'ils puissent se charger correctement même si les dépendances requises ne sont pas présentes, puis leur attribuer une propriété qui vérifiera si la dépendance est présente.