J'utilise MEF depuis un certain temps et le facteur clé pour lequel nous l'utilisons au lieu des produits IOC est que nous avons régulièrement 3-5 implémentations d'une interface donnée dans notre répertoire de plugins à un moment donné. La décision d'utiliser l'une de ces implémentations ne peut être prise qu'au moment de l'exécution.
Le MEF vous permet de le faire. En général, l'IOC vise à s'assurer que vous pouvez remplacer, par exemple, un IUserRepository basé sur le produit ORM 1 par le produit ORM 2 à un moment donné dans le futur. Cependant, la plupart des solutions IOC supposent qu'il n'y aura qu'un seul IUserRepository en vigueur à un moment donné.
En revanche, si vous devez en choisir un en fonction des données d'entrée d'une demande de page donnée, les conteneurs IOC sont généralement perdus.
À titre d'exemple, nous effectuons notre vérification des autorisations et notre validation via des plugins MEF pour une grande application web sur laquelle je travaille depuis un certain temps. En utilisant le MEF, nous pouvons regarder la date CreatedOn de l'enregistrement et rechercher le plugin de validation qui était réellement en vigueur lorsque l'enregistrement a été créé et exécuter l'enregistrement à la fois dans ce plugin ET dans le validateur actuellement en vigueur et comparer la validité de l'enregistrement dans le temps.
Ce type de pouvoir nous permet également de définir des surcharges de repli pour les plugins. Les applications sur lesquelles je travaille sont en fait la même base de code déployée pour plus de 30 implémentations. Donc, nous avons typiquement chercher des plugins en demandant :
- Une mise en œuvre de l'interface qui est spécifique au site actuel et au type d'enregistrement spécifique en question.
- Une mise en œuvre de l'interface qui est spécifique au site actuel, mais qui fonctionne avec tout type d'enregistrement.
- Une interface qui fonctionne pour tout site et tout enregistrement.
Cela nous permet de regrouper un ensemble de plugins par défaut qui s'activeront, mais seulement si cette implémentation spécifique ne les remplace pas par des règles spécifiques au client.
L'IOC est une excellente technologie, mais il semble qu'il s'agisse surtout de faciliter le codage en fonction des interfaces plutôt que des implémentations concrètes. Cependant, l'échange de ces implémentations est plutôt un événement de type changement de projet dans IOC. Dans le MEF, vous prenez la flexibilité des interfaces et des implémentations concrètes et vous en faites une décision d'exécution entre plusieurs options disponibles.