Domanda

sono in un grosso dilemma..Sto lavorando su un'app Web altamente modulare in ASP.NET MVC 2 (in effetti, il core sarà super leggero, tutto funzionerà su moduli/plugin).Ho trovato MEF piuttosto utile per il rilevamento dei moduli, ma non voglio utilizzarlo come contenitore IoC.Ci sono buone probabilità che avrò bisogno di funzionalità avanzate del "vero" contenitore IoC, quindi vorrei utilizzare Unity.

Ed ecco il problema:come consentire ai moduli di configurare il contenitore (a livello di programmazione) = registrare i propri tipi (controller mvc, implementazioni personalizzate di servizi...) all'avvio dell'applicazione senza creare una forte dipendenza da Unity in tutti i moduli?Conosco il progetto Common Service Locator e sembra abbastanza buono, ma questo co-contenitore dell'interfaccia consente solo di risolvere i tipi, non di registrarli (afaik).

Spero davvero che tu possa capire il mio punto, so che il mio inglese è terribile (vengo dal paese di lingua non inglese :) grazie mille!

È stato utile?

Soluzione

Posso certamente simpatizzare con il fatto di non voler utilizzare MEF come contenitore DI, ma penso che dovresti comunque considerare se ciò potrebbe non essere applicabile ai tuoi componenti aggiuntivi.

Voi richiedono già che i componenti aggiuntivi utilizzino MEF, quindi avranno tutti una forte dipendenza da esso.Anche se personalmente non mi piace l'approccio hardcoded e basato sugli attributi utilizzato da MEF, sembra che tu stia chiedendo come ciascun componente aggiuntivo possa registrarsi con il contenitore DI.Anche questo mi sembra un hardcoding, quindi potresti anche usare MEF fino in fondo.

Applicazione degli attributi MEF È registrazione dei componenti.

Se davvero non vuoi utilizzare MEF hai solo poche altre opzioni (nessuna delle quali particolarmente attraente):

  • Richiede che tutti i componenti aggiuntivi abbiano anche una forte dipendenza da Unity.Capisco perfettamente perché non vuoi farlo, ma includo questa opzione solo per completezza
  • Richiedere a tutti i componenti aggiuntivi di assumere anche una forte dipendenza da Common Service Locator.A mio avviso, questo sposta solo leggermente il problema.
  • Definisci la tua interfaccia di registrazione del componente aggiuntivo che tutti i componenti aggiuntivi devono implementare.È quindi possibile scrivere la propria implementazione che utilizza Unity, in modo che tutti i componenti aggiuntivi si registrino su questa interfaccia, ma in questo caso si limiterebbe più o meno a duplicare le funzionalità di MEF.
  • Scrivi tutti i componenti aggiuntivi in ​​a Compatibile con DI, ma indipendente dal contenitore stile.Ciò lascia il problema con la configurazione del contenitore DI e per questo dovrai quindi ricorrere alla configurazione XML.Questo è veramente fragile approccio e può portare rapidamente a inferno di manutenzione, quindi ancora una volta includo questa opzione solo per ragioni di completezza.

L'uso di MEF per i componenti aggiuntivi non ti impedisce di utilizzare Unity nella tua applicazione principale, ma capisco che è molto leggero, quindi potrebbe non avere molto senso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top