Metro Theme for Orchard CMS – Novità

Solo due giorni fa scrivevo due righe per notificare ai passanti che da qualche giorno, nel tempo libero, sto viluppando un tema per Orchard e che per ovvie motivazioni ho battezzato con il nome di  Metro Theme for Orchard

Ma tutto mi aspettavo tranne di arrivare in questi ultimi 2 giorni a rifattorizzare tutti i CSS con l’intento di migliorare la resa grafica e la navigabilità su diverse tipologie di dispositivi (tablet, smartphone, desktop, ecc…).

Che non si urli al miracolo, sia chiaro! 😀
..un lungo lavoro mi attende, dopo tutto il progetto ha solo una settimana di vita!

Comunque per il momento chi vuole può recarsi sul sito del progetto e scaricare i sorgenti per vedere il tema all’opera, sempre considerando che si tratta di una versione mooolto Alpha!

Ed ecco le nuove screenshoot del sito d’esempio che sto preparando e che appena terminato sarà scaricabile, come già fatto per il tema Mango Theme.

Metro Theme for Orchard - Light Blue

Metro Theme for Orchard - Dark Green

Metro Theme for Orchard CMS

Un bel po’ di tempo fa ho sviluppato un tema dallo stile “vagamente” Windows Phone per Orchard CMS che potete trovare in rete con tanto di codice sorgente utilizzando la keywords Mango Theme (o più semplicemente cliccando sui link che vi ho lasciato).

Bene! Bravo Marco anche tu hai dato il tuo piccolo contributo al mondo dell’open source!

Questo era quello che pensavo fino a un po’ di tempo fa.. ma visto che non so mai tenere la bocca chiusa mi sono lasciato scappare in una discussione su un forum la notizia che di tanto in tando mi solleticava l’idea di sviluppare un tema in stile Metro Style (e si al tempo si chiamava ancora così) magari con qualche possibilità di personalizzazione in quanto ai colori, ecc..

Signori e signori parafrasando un’antica sentenza medievale oggi affermo che “ogni promessa è debito” ed io sono un uomo di parola… così questa notte invece di dormire sono qui ad uploadare su codeplex.com i sorgenti della versione 0.5 ancora in Alpha del tema “promesso” anche se la strada per una prima versione finale è ancora lontanuccia…

Per i più curiosi vi lascio alcune screenshot

Ecco il tema nella versione Light + Accent Color Blue

Metro Theme Orchard Blue - Home

mentre qui invece lo vediamo nella versione Dark + Accent Color Green con una panoramica sui principali stili tipografici attualmente disponibili

Metro Theme Orchard Dark Green

Inoltre visto che relativamente a Mango Theme mi è stato chiesto più volte di avere la possibilità di personalizzare alcune caratteristiche del tema direttamente dal pannello amministrativo di Orchard l’attuale view per la personalizzazione del tema

Metro Theme Settings

Bene, speriamo quindi di avere presto una prima versione finale!!! (ricordo che è gradito qualsiasi tipo di input, critica e/o consiglio (magari direttamente nel forum sul sito del progetto).

Bye! 😉

MVC Web Api e IHttpControllerActivator Dependency Injection

In questi giorni sto lavorando ad un progetto interessante che prevede un massiccio uso di ASP.NET Web API.
Così, come ormai ad ogni startup di progetto, ci prepariamo ad architettare quel qualcosa 🙂 che ci permetta di iniettare dove necessario le giuste dipendenze allo scopo di semplificare la fase di test dei prodotti finali delle nostre svariate elucubrazioni mentali 😀 …

Dopo una serie di considerazioni fatte, sulle quali non mi dilungherò,  decidiamo di utilizzare MS Unity come IoC Container e ci lanciamo nell’ormai classica implementazione di un ControllerFactory per intercettare la creazione dei Controller per l’applicazione ASP.NET MVC4 come segue

public class UnityControllerFactory : DefaultControllerFactory
{
    private readonly IUnityContainer _container;

    /// <summary>
    /// Base Constructor
    /// </summary>
    ///Instance of Container.
    public UnityControllerFactory(IUnityContainer container)
    {
        _container = container;
    }

    /// <summary>
    /// Returns a valorized instance of the container.
    /// </summary>
    /// <param name="requestContext">Information about HTTP Request.</param>
    /// <param name="controllerType">Controller Type.</param>
    /// <returns></returns>
    protected override IController GetControllerInstance(RequestContext requestContext,
                                                         Type controllerType)
    {
        Contract.Requires(requestContext != null, "requestContext");
        Contract.Requires(controllerType != null, "controllerType");

        return _container.Resolve(controllerType) as IController;
    }

    /* Ulteriori override di nostra necessità...
     * protected override ...
     * {
     *    ...
     * }
    */
}

Nulla di nuovo quindi e procediamo a registrare il nostro container nel global.asax

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        var container = this.GetContainer("unity");
        var unityControllerFactory = new UnityControllerFactory(container);
        ControllerBuilder.Current.SetControllerFactory(unityControllerFactory);
    }

    public IUnityContainer GetContainer(string name)
    {
        IUnityContainer container = new UnityContainer();

        object section = ConfigurationManager.GetSection(name);
        if (section == null)
            throw new InvalidOperationException("No unity configuration was found, could not instansiate container");

        UnityConfigurationSection unityConfigurationSection = section as UnityConfigurationSection;
        unityConfigurationSection.Configure(container);

        return container; 
    }
         
}

Ma purtroppo ci rendiamo subito conto che l’implementazione del nostro UnityControllerFactory non ci permette di intercettare la creazione degli ApiCotroller e di conseguenza neanche di iniettare le nostre dipendenze in questi ultimi… la soluzione?

Abbiamo bisogno di un UnityHttpControllerActivator (per ulteriori informazioni leggi qui)

Poche righe ancora quindi per intercettare la creazione i nostri WebApiController

public class UnityHttpControllerActivator : IHttpControllerActivator
{
    private readonly IUnityContainer _container;
    private readonly DefaultHttpControllerActivator _defaultActivator;

    public UnityHttpControllerActivator(IUnityContainer container)
    {
        _container = container;
        _defaultActivator = new DefaultHttpControllerActivator();
    }

    public IHttpController Create(System.Net.Http.HttpRequestMessage request, 
                                  HttpControllerDescriptor controllerDescriptor, 
                                  Type controllerType)
    {
        IHttpController httpController = _container.Resolve(controllerType) as IHttpController;
        if (httpController != null)
        {
            return _container.Resolve(controllerType) as IHttpController;
        }
        else
        {
            return _defaultActivator.Create(request, controllerDescriptor, controllerType);
        }
    }
}

a questo punto dobbiamo aggiungere alla funzione Application_Start nel global.asax

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        var container = this.GetContainer("unity");
        var unityControllerFactory = new UnityControllerFactory(container);
        ControllerBuilder.Current.SetControllerFactory(unityControllerFactory);

        var unityHttpControllerActivator = new UnityHttpControllerActivator(container);
        GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), 
                                                           unityHttpControllerActivator);
    }
    
    ...
}

Bene! ..ed ora iniettate tutte le dipendenze di cui avete bisogno e buon lavoro! 😀

ASP.NET MVC, Web API, Razor ora Open Source

Ormai è ufficiale dal 28 marzo 2012 i sorgenti di ASP.NET MVCWeb API e Razor sono stati rilasciati sotto licenza Apache 2.0.

Un altro importante passo in avanti a favore dell’Open Source in casa Microsoft che pubblicizza con entusiasmo la possibilità di poter coinvolgere gli sviluppatori ASP.NET di tutto il mondo nel seguire passo passo gli sviluppi e nel proporre eventuali correzioni a bug o implementazioni di nuove funzionalità (che saranno poi opportunamente vagliate dal team di sviluppo di ASP.NET).

Microsoft, inoltre, ci tiene a precisare che il prodotto finale rimarrà pienamente supportato.

Per chi fosse quindi interessato a farsi un pò di cultura ecco dove trovre il codice sorgente di ASP.NET MVC, Web API e Razor

Buona Lettura 😀