Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese
Informazioni
L'argomento richiesto è visualizzato di seguito, ma non è incluso in questa libreria.

Procedura: utilizzare MEF con MVC

.NET Framework (current version)

Questo argomento illustra come creare un'app MVC (Model-View-Controller) ASP.NET che usa MEF (Managed Extensibility Framework). È possibile usare MEF per connettere i modelli, le visualizzazioni e i controlli che costituiscono il meccanismo di gestione delle richieste di un'app MVC. Gli oggetti specifici dell'app che eseguono la logica di business dell'app possono essere rappresentati come parti MEF. Il motore della composizione MEF fornisce il controller MVC con parti complete e pronte per l'uso e gestisce automaticamente l'eliminazione e la chiusura di queste parti.

In questo argomento si presuppone una familiarità con i concetti illustrati in Panoramica di MEF.

Nota importante Importante

Per le procedure in questo argomento è necessario Visual Studio 2012 o versioni successive.

A partire da Visual Studio 2012, Visual Studio include un modello che permette di creare una soluzione MVC ASP.NET.

Per creare il progetto MVC

  1. In Visual Studio creare un nuovo progetto di tipo applicazione Web MVC 3 ASP.NET e assegnare al progetto il nome MEFMVCApp.

  2. Nella finestra di dialogo Nuovo progetto ASP.NET MVC 3 scegliere Applicazione Internet.

  3. Creare una cartella denominata Parti nel progetto. Le parti sono le unità di base della composizione MEF e possono essere usate per fornire tutti i servizi app non offerti dall'app MVC stessa, ovvero l'accesso ai dati, l'esecuzione di calcoli, l'accesso ad altri siti o servizi e l'implementazione della logica di business.

Nell'app MVC ASP.NET usare le interfacce per definire il contratto fornito da una parte alle altre parti.

Per esportare e importare parti

  1. Aprire il menu di scelta rapida per la cartella Parti e aggiungere un'interfaccia con nome ILogger.cs. Aggiungere il codice seguente:

    public interface ILogger
    {
        void Write(string text);
    }
    
    

    Si presuppone che eventuali classi concrete nella cartella Parti siano destinate alla composizione gestita. In termini MEF, queste classi saranno esportate. Vedere Panoramica di MEF. Per convenzione, si presuppone che eventuali interfacce implementate come parte siano i contratti da esportare.

  2. Aprire il menu di scelta rapida per la cartella Parti e aggiungere una classe con nome TraceLogger.cs. Aggiungere il codice seguente:

    public class TraceLogger : ILogger
    {
        public void Write(string text)
        {
            System.Diagnostics.Trace.WriteLine(text);
        }
    }
    
    

    Questa parte sarà esportata con il tipo di contratto ILogger. Per usare questa parte nell'app MVC, è possibile importarla nel controller.

  3. Aprire HomeController.cs nella cartella Controllers. Aggiungere un'istruzione using per lo spazio dei nomi MEFMVCApp.Parts. Aggiungere i membri e i costruttori seguenti:

        ILogger _logger;
    
         public HomeController() : this(new TraceLogger())
          {
          }
    
        public HomeController(ILogger logger)
        {
            _logger = logger;
        }
    
    
  4. Aggiungere la riga seguente al corpo del metodo Index() per illustrare TraceLogger:

    _logger.Write("MEFMVCApp: Executing the Index() action method.");
            
    

    Compilare ed eseguire il progetto. Quando la pagina di indice è visualizzata, il messaggio registrato compare nella finestra di traccia.

Il motore della composizione MVC crea supposizioni in merito all'uso possibile delle parti in base alle convenzioni. È possibile eseguire l'override di questi comportamenti predefiniti tramite l'aggiunta degli attributi MEF alle parti.

Per eseguire l'override del comportamento predefinito

  1. In TraceLogger.cs aggiungere un'istruzione using per System.ComponentModel.Composition, quindi aggiungere l'attributo seguente alla classe:

    [Export("myTraceLogger", typeof(ILogger))]
    

    HomeController non sarà in grado di importare TraceLogger, poiché i nomi dei contratti non corrispondono più.

  2. Per aggiungere un nome di contratto all'importazione, in HomeController.cs aggiungere un'istruzione using per System.ComponentModel.Composition, quindi modificare il costruttore nella classe come indicato di seguito:

            public HomeController([Import("myTraceLogger")]ILogger logger)
            {
                _logger = logger;
            }
    

    Importazione ed esportazione sono di nuovo corrispondenti. Per altre informazioni sugli attributi MEF, vedere Cenni preliminari sul modello di programmazione con attributi.

Le istanze delle parti create in un'app MVC esistono in uno dei due ambiti, ovvero l'ambito delle richieste o l'ambito delle applicazioni. Per impostazione predefinita, le istanze delle parti create durante una richiesta Web si trovano in un ambito delle richieste. Le istanze delle parti che si trovano nella stessa richiesta sono condivise. Se più di una parte importa una parte specifica, tutte le utilità di importazione riceveranno quindi un riferimento alla stessa istanza. Ogni richiesta Web ha il proprio ambito. Le parti create in una richiesta non sono quindi mai usate per compilare le importazioni in un'altra richiesta.

Al termine di una richiesta, l'ambito ad essa associato è eliminati ed eventuali parti create per la richiesta sono eliminate. Le parti che implementano un oggetto IDisposable sono eliminate. Ciò assicura che le risorse riservate, ad esempio le connessioni a database, siano chiuse correttamente.

A volte non si vuole creare un'istanza di parte per ogni richiesta, ad esempio quando si implementa una cache a livello di app. In questi casi è possibile imporre la creazione di una parte nell'ambito dell'applicazione, applicando l'attributo SharedAttribute. Le parti nell'ambito dell'applicazione sono sempre condivise da tutte le richieste nell'app. Una parte nell'ambito dell'applicazione può dipendere da un'altra parte nell'ambito dell'applicazione solo per le importazioni. Occorre impostare con cautela su thread-safe le parti nell'ambito dell'applicazione.

È possibile eseguire l'override delle impostazioni predefinite per la condivisione usando gli attributi MEF, in modo analogo all'uso degli attributi di importazione ed esportazione nella sezione precedente. Per altre informazioni sugli attributi MEF, vedere Cenni preliminari sul modello di programmazione con attributi.

È possibile applicare attributi del filtro azioni a controller e azioni per cambiare il modo in cui sono eseguite le azioni. Anche se gli attributi del filtro azioni non sono creati dal provider di composizione, possono essere forniti con parti tramite l'attributo Import.

Per fornire un filtro azioni

  • Usare l'attributo Import, come indicato nell'esempio seguente:

public class SaveChangesAttribute : ActionFilterAttribute
{
    [Import]
    public IDbContext DbContext { get; set; }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Exception == null)
            DbContext.SaveChanges();
    }
}

Mostra: