Différence entre les conteneurs MEF et IoC (comme Unity, Autofac, SMap, Ninject, Windsor.Spring.net, etc.)

J’ai cherché sur l’dependency injection et lu quelques articles. Mais je n’arrive toujours pas à découvrir la différence entre le MEF et les autres IoC. Donc, ma question est la suivante: dans quelle situation devrais-je préférer utiliser un conteneur MEF ou IoC?

Pourquoi est-il utile d’utiliser MEF avec PRISM pour (WPF & Silverlight) ou pour les applications de bureau?

Alors que dans l’application Web, les utilisateurs utilisent des conteneurs IoC.

Alors, quels sont les critères pour décider quelle technique de dépendance je devrais utiliser?

J’ai été à travers l’article http://devlicio.us/blogs/casey/archive/2009/12/18/what-is-the-difference-between-an-ioc-container-and-mef.aspx , mais je n’a rien pu déterminer.

Finalement, ce que j’ai conclu sur le conteneur MEF vs IoC est le suivant:

Il est préférable d’utiliser MEF pour traiter des types inconnus ou une architecture basée sur des plug-ins.

Les conteneurs IoC sont préférables pour être utilisés avec des types connus.

De plus, MEF est une solution architecturale pour l’dependency injection

Alors que les conteneurs IoC sont des solutions de niveau code pour l’dependency injection.

Les conteneurs IoC ne sont que des techniques d’dependency injections qui remplissent l’instance d’une classe et si le constructeur de ces classes requirejs des objects d’autres classes, alors IoC injecte également les objects requirejs. Mais le MEF fait plus que de l’dependency injection. Cependant, MEF utilise également une approche basée sur l’IoC pour l’dependency injection, mais le MEF fait beaucoup d’autres choses en dehors de l’dependency injection.

MEF a deux composantes:

  1. Catalogue: Est responsable de la découverte de l’extension

  2. Conteneur: permet de charger une extension vers une application en cours d’exécution

MEF est plus que des techniques d’dependency injection. Il est utilisé dans le cadre d’une architecture basée sur des plugins pour notre application, mais parallèlement, MEF utilise une approche basée sur l’IoC pour l’dependency injections.

Je m’attends à plus de gens à commenter cela.

IoC est une stratégie de conception architecturale, et MEF est une implémentation de l’dependency injections du modèle de conception. L’dependency injection (DI) est souvent la stratégie de mise en œuvre de l’IoC. Souvent, le terme conteneur IoC est utilisé, ce qui suggère que l’IoC est la technique.

Non, c’est autrement. IoC est un concept large et DI est le modèle de conception pour mettre en œuvre le kernel de l’IoC. Le MEF est une forme de DI, mais il n’a pas toutes les caractéristiques fondamentales de l’IoC.

MEF utilise la composition pour déterminer les dépendances à résoudre. Cela ressemble beaucoup à beaucoup d’autres conteneurs IoC, par exemple Pico et Spring . Mais ça s’arrête là. Je n’ai pas vu de gestion du cycle de vie ni de configuration de pooling. Je considère que ces deux derniers éléments constituent une partie fondamentale de l’IoC (et non de l’ID), car les performances de l’appelant ne devraient pas être affectées par la consommation de mémoire utilisée par l’appelé.

Le principe de l’IoC est un service destiné à l’appelant et à l’appelé en les couplant de manière lâche. De cette façon, les deux fonctionnalités peuvent fonctionner de manière optimisée. MEF pourrait avoir le problème qu’il existe des problèmes avec l’optimisation. Par exemple, lorsque vous appelez depuis le menu vers une firebase database, un appel à la firebase database est effectué à un moment donné. Il est toujours préférable d’utiliser la mise en commun pour cela. MEF n’est pas capable de faire cela.

Le type d’application doit être indépendant du choix d’un modèle de conception. Il n’y a pas de grande différence entre un bureau ou une application Web. Les deux sont des interfaces utilisateur et les deux devraient pouvoir utiliser MEF et IoC. Si la fonctionnalité est simple et n’a pas besoin de franchir les limites de l’optimisation (comme les appels de firebase database), MEF est le premier choix, car il s’agit d’une infrastructure utilisée lors de l’utilisation de .NET 4. franchit une limite d’optimisation (comme l’parsing syntaxique ou le téléchargement d’un fichier), l’utilisation d’un conteneur IoC est plus efficace en termes de performances et de maintenance.

Informations que j’ai utilisées:

  • Hanselminutes 148 (interview en podcast avec Glenn Block).

  • Cadre d’extensibilité géré (MEF) (MSDN)

  • À la pointe de la technologie – Extensibilité de l’application: MEF vs. IoC

  • Inversion des conteneurs de contrôle et du modèle d’dependency injection

  • Inversion de contrôle (Wikipedia)

  • Pourquoi exactement MEF n’est-il pas un conteneur DI / IoC?