Pagine

domenica 6 dicembre 2015

Asp:net MVC - Portable areas

In ASP.NET MVC è possibile creare un progetto modulare sfuttando le portable areas.
Solitamente viene utilizzato MVCContrib che congloba tutto (view comprese) in un'unica DLL (potete vedere qui MVC Portable Areas)
Un'alternativa invece consiste nel copiare soltato il necessario magari sfruttanto autofac per il caricamento dell'area installata.
Come?



Iniziamo con il creare il progetto base:

Otteremo quindi un progetto web base :

Creiamo quindi la cartella che conterrà le nuova area :

Quindi creiamo un nuovo progetto web che sarà la nostra nuova area. Da notare che il percorso dove andremo a creare questo nuovo progetto è all'interno della cartella Areas creata precedentemente. Per questo nuovo progetto selezioniamo ovviamente che è di tipo MVC.




A questo punto dobbiamo definire il percorso di generazione della bin. Infatti vogliamo che la nostra dll compilata vada a finire nel bin del progetto principale quindi :

Avremo quindi le view create all'interno dell'area Modulo1 e la dll della stessa dentro la bin del progetto principale.
Dal progetto Modulo1 eliminiamo tutto ciò che non serve come ad esempio Global.asax e il startup.cs e il contenuto delle cartelle. Lasciamo solo il web.config che servono. Nel web.config principale togliamo tutto lasciando solo il tag configuration vuoto.
In Views invece lasciamo il web.config generato da visual studio.



Ovviamente ora dovremo definire il mapping route del progetto aggiungendo una nuova classe nella root del modulo che stiamo come se fosse un'area normale:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Modulo1
{
    public class Modulo1AreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get { return "ModuloAggiuntivo"; }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
          
            context.MapRoute("ModuloAggiuntivo_default",
                "ModuloAggiuntivo/{controller}/{action}/{id}",
                new { controller = "ModuloAggiuntivo", action = "Index", id = UrlParameter.Optional },
                new string[] { "ModuloAggiuntivo.Controllers" });


        }
    }
}

Creiamo un controller all'interno del modulo (nel mio caso ProvaController) e se abbiamo fatto tutto apposto, basta lanciare il progetto con un F5 e dirigersi ad esempio a http://localhost:58794/ModuloAggiuntivo/Prova se abbiamo fatto tutto bene il server dovrebbe rispondere correttamente.
I vantaggi di questa struttura è che in fase di deploy se non si mette nella bin la DLL ModuloAggiuntivo.DLL l'area non esisterà. Avremo quindi non solo una struttura modulare, ma una struttura a plugin