39

Ho cercato l'iniezione di dipendenza e ho letto alcuni articoli. Ma ancora non riesco a scoprire la differenza tra MEF e altri IoC. Quindi, la mia domanda è questa: in quale situazione preferirei usare un contenitore MEF o IoC?Differenza tra contenitori MEF e IoC (come Unity, Autofac, SMap, Ninject, Windsor.Spring.net, ecc.)

Perché è opportuno utilizzare MEF con PRISM per (WPF & Silverlight) o per applicazioni desktop?

Mentre nelle applicazioni Web le persone utilizzano contenitori IoC.

Quindi, quali sono i criteri per decidere quale tecnica di dipendenza dovrei usare?

Sono stato attraverso l'articolo http://devlicio.us/blogs/casey/archive/2009/12/18/what-is-the-difference-between-an-ioc-container-and-mef.aspx , ma non ho potuto determinare nulla.

+1

post utile: http://stackoverflow.com/questions/216565/why-exactly-isnt-mef-a-di-ioc-container – dugas

+0

@duga grazie per il link, ma voglio comunque sapere che MEF può lavorare con tipi noti o meno e Perché MEF è usato in Silverlight e WPF (modelli MVVM), se hanno tipi sconosciuti o meno –

risposta

35

Alla fine quello che ho concluso sul contenitore MEF vs CIO è la seguente:

MEF è preferito da usare quando si ha a che fare con tipi sconosciuti o un'architettura basata plugin.

I contenitori IoC sono preferiti per l'utilizzo con tipi noti.

Inoltre, MEF è una soluzione architettonica iniettabile dipendenza

considerando, contenitori IoC sono soluzioni a livello di codice per l'iniezione di dipendenza.

I contenitori IoC sono solo tecniche di iniezione delle dipendenze che popolano l'istanza di una classe e se il costruttore di tali classi richiede oggetti di altre classi, quindi IoC inietta anche gli oggetti richiesti. Ma MEF fa molto più che semplice iniezione di dipendenza. Anche se, MEF usa anche un approccio basato su IoC per l'iniezione di dipendenza, ma MEF fa tante altre cose oltre all'iniezione di dipendenza.

MEF ha due componenti:

  1. catalogo: È responsabile per la scoperta estensione

  2. Container: offre la possibilità di caricare una proroga per un running applicazione

MEF è più di semplici tecniche di iniezione di dipendenza. Viene utilizzato in cui abbiamo bisogno di un'architettura basata su plugin per la nostra applicazione, ma allo stesso tempo MEF utilizza un approccio basato su IoC per l'iniezione delle dipendenze.

Mi aspetto che più persone possano commentare questo.

+0

[Qui] (https://visualstudiomagazine.com/articles/ 2013/04/01/unity-vs-mef.aspx) è un buon articolo su questo confronto. La conclusione dell'autore alla fine è comunque un po 'spaventosa: "La cattiva notizia è che, tre mesi dopo averne raccolto uno, ti imbatterai in un problema che sarebbe stato più facile risolvere con l'altro strumento". – RBT

20

IoC è una strategia di progettazione architettonica e MEF è un'implementazione dell'iniezione di dipendenza del modello di progettazione. L'iniezione di dipendenza (DI) è spesso la strategia di implementazione di IoC. Spesso viene usato il termine contenitore IoC, suggerendo che IoC è la tecnica.

No, è il contrario. IoC è un concetto ampio e DI è lo schema di progettazione per implementare il nucleo di IoC. MEF è una forma di DI, ma non ha tutte le caratteristiche fondamentali di IoC.

MEF utilizza la composizione per scoprire le dipendenze che è necessario risolvere.È molto simile a molti altri contenitori IoC, ad esempio Pico e Spring. Ma si ferma qui. Non ho visto alcuna gestione del ciclo di vita né configurazione di pooling. Questi ultimi due considerano una parte fondamentale di IoC (non di DI), poiché le prestazioni del chiamante non dovrebbero risentirne a causa del consumo di memoria utilizzato dal destinatario.

Il principio IoC è un servizio per il chiamante e il destinatario accoppiandoli liberamente. In questo modo entrambe le funzionalità possono funzionare ottimizzate. MEF potrebbe avere il problema che ci sono problemi con l'ottimizzazione. Ad esempio, quando si ha una chiamata dal menu a un database, a quel punto verrà effettuata una chiamata al database. È sempre meglio usare il pool per questo. MEF non è in grado di farlo.

Il tipo di applicazione deve essere indipendente dalla scelta per un modello di progettazione. Non c'è una grande differenza tra un desktop o un'applicazione web. Entrambe sono interfacce utente ed entrambe dovrebbero essere in grado di utilizzare MEF e IoC. Se la funzionalità è semplice e non ha bisogno di attraversare i limiti di ottimizzazione (come le chiamate al database), allora MEF è la prima scelta, perché è un framework che è presente quando si usa .NET 4. Quindi potrebbe essere utile, ma se una chiamata attraversa un limite di ottimizzazione (come l'analisi o il caricamento di un file), quindi l'utilizzo di un contenitore IoC è più proficuo per prestazioni e manutenzione.

informazioni che ho usato: