Apr 20 2013

MVVM Stack for WinJS by Corrado Cavalli available on Codeplex

I’m a big fan of separation of concerns: applying the correct architecture and patterns is the right way to make a successful project instead of making it fail.

There’s a lot of buzz in this period around Windows 8 and its programming model based around WinRT, WinJS, CSS3 and HTML: the platform is out from a while and it’s ready for prime time. What about applying some best practices for building awesome applications?

I’m coming from a XAML background and, in the past years, I had the opportunity to verify in real projects how the correct usage of patterns like MVVM, Commanding, Event Aggregation, Dependency Injection (and more…) permits the developer to build reliable, maintainable and scalable applications.

MVVM Stack for WinJS is a new project by my friend and Microsoft MVP Corrado Cavalli: it contains a set of  reusable classes that helps you creating Windows Store Applications using MVVM, messaging, suspend/resume support, Blendability (design-time data) and more.

The available documentation contains useful information about:

The code is available for download on Codeplex and contains a sample application describing the concepts.

Happy coding everyone!


Dec 24 2012

Windows 8 Line of Business (LOB) Guidance – Prism on .NET 4.5 and the road to Windows Store apps

Just a quick post to highlight an interesting article by Blaine Wastell about a new project (codename “Kona“)  that will provide guidance on developing line of business (LOB) apps for Windows 8.

Check out this link for the details of this interesting project!


Feb 18 2012

Prism 4.1 – February 2012 available for download

Prism provides guidance designed to help you more easily design and build rich, flexible, and easy to maintain Windows Presentation Foundation (WPF) desktop applications and Silverlight Rich Internet Applications (RIAs) and Windows Phone 7.1 (“Mango”) applications.

The new version 4.1 released on February 2012 is available for download here.

Read the official announcement by Blaine Wastell: Prism for Silverlight 5 Ships.


May 16 2011

Silverlight Integration Pack for Microsoft Enterprise Library 5.0 released

Check out the original post by Grigori Melnik about the new release of Silverlight Integration Pack for Microsoft Enterprise Library 5.0.

 

A Quick look:

Asset Description
Validation Application Block The Validation Application Block supports the following scenarios:

  • Executing validation rules across multiple tiers and gathering results.
  • Annotating your business entities with validation attributes.
  • Ensuring validation attributes compatibility with WCF RIA Services.
  • Defining validation rules in configuration.
  • Validating conditionally using rule sets.
  • Implementing self-validation.
  • Defining validation attributes in metadata. Silverlight doesn’t support the MetadataTypeAttribute. In the .NET Framework, this attribute is used to define metadata classes with validation attributes for your generated business entities. The Validation Application Block provides an implementation of the MetadataTypeAttribute for Silverlight.
  • Supporting IDataErrorInfo.
Logging Application Block Allows you to decouple your logging functionality from your application code. The Logging Application Block routes log entries to various out-of-the-box or custom destinations (locally or through a web service), it supports runtime changes to, for example,  turn existing logging up and down or change logging destinations. Batch logging is supported. The block is shipped with an implementation of a WCF Remote logging service that integrates with the desktop version of the Logging block. Additionally, tracing feature allows you to correlate log entries to a specific activity/workunit scope.
Caching Application Block A brand new implementation of the Caching application block, which is mimicking the System.Runtime.Caching API from .NET with support for in-memory caching and persistent caching (via isolated storage). It has support for expiration and scavenging policies as well notification of cache purging.
Exception Handling Application Block A port of the desktop version of the Exception Handling Application Block, which allows you to handle exceptions that might occur in any layer of your application in a consistent manner.
Interception & Policy Injection Application Block Update to Unity container for Silverlight with support for type and instance interception.
Configuration support The Silverlight Integration Pack offers flexible configuration options, including:

  • XAML-based configuration support
  • Asynchronous configuration loading
  • Interactive configuration console supporting profiles (desktop vs. Silverlight)
  • Translation tool for XAML config (needed to convert conventional XML configuration files) available as a config tool wizard, an MS Build task, or a standalone command-line tool
  • Programmatic configuration support via a fluent interface or attributes
Reference Implementation New Developer’s Guide and an accompanying Reference Implementation to illustrate the typical challenges when building a Silverlight LOB application.StockTrader V2 Reference Implementation (RI) (via a separate download)

More resources, documentation and download links are available in the public announcement.

Happy Silverlighting!


Mar 6 2011

Prism 4.0 – Useful Resources and Templates (including MEF support)

A quick shoutout to point out that David Hill has just released a new version of the PRISM Template Pack now including both MEF and Unity support.

Other useful resources about PRISM 4.0:

 

Developer’s Guide to Microsoft Prism 4

Now available from O’Reilly

 


Oct 4 2010

MEF Contrib is live!

Check out this great resource for MEF (Managed Extensibility Framework developers:

From the main site:

MefContrib is a community-developed set of extensions, tools and samples for the Managed Extensibility Framework (MEF).

The project is an open source project, licensed under the MS-PL license. MefContrib is about YOU. With your help we can make it a vibrant resource for MEF developers world-wide.

MEF Contrib is the one stop shop for all your MEF needs. Within you’ll find:

  • Community extensions to MEF like support for convention based registration, open generics and AOP.
  • Tools like Visual MEFX, a tool for diagnosing composition
  • Guidance, Quickstarts and Samples to help you learn the ropes from experts


Jul 26 2010

Silverlight 4, MEF and MVVM: loading different “MEF Modules” in the same Container

Today I’ve finally found some time to make modifications in the “MEF MVVM” project on Codeplex in order to:

  • create a new module using WCF RIA Services and dynamically load this it inside the “MEF module container” described in the previous post;
  • use the INavigationContentLoader interface and MEF Metadata to share the same container for the various “MEF Modules”;
  • use the new Cosmopolitan theme available for Silverlight Navigation applications;
  • refactor the code of the ViewModel base class using the one available in the latest Prism drops;
  • refactor unit tests inserting an apposite Mock service.

MEFMVVMRIA
The source code is available for download on Codeplex.

Happy Silverlighting!


May 4 2010

Slides and Code from my Silverlight 4 – MEF webcast

Here you can find the sample code and slides (in italian) from my webcast around Silverlight 4 and MEF for the local XEdotNET user group.

The samples contain the following topics:

  • Simple composition using the CompositionInitializer;
  • Multiple Exports;
  • Metadata;
  • Custom Attributes;
  • Dynamic object creation with ExportFactory;
  • Simple MVVM example using MEF;
  • MEF, MVVM and PRISM EventAggregator;
  • Dynamic XAP loading using DeploymentCatalog;
  • MEF, MVVM and Blend Sample Data.

Hope this helps and Happy Silverlighting!


Apr 5 2010

Silverlight 4, MEF and MVVM: MEFModules, Dynamic XAP Loading and Navigation Applications

In the last example I’ve implemented a new “MEF Module” organized with a MVVM approach and using Prism Event Aggregator to exchange messages.

This new module could be used to partititon the application in several XAPs composed dynamically at run-time using MEF, the new DeploymentCatalog and the Navigation features available in Silverlight.

To start I’ve created a new “Silverlight Navigation Application” which produces a complete application with ready-to-use navigation and localization.

Then I’ve inserted a new “Silverlight User Control” inside the “Views” folder and named it “MEFModuleContainer“: this one is called by the navigation framework and is responsible to load dynamically the module using the MEF “DeploymentCatalog“.

This is the XAML of the container:

<StackPanel x:Name="ContentStackPanel">
    <TextBlock x:Name="HeaderText" Style="{StaticResource HeaderTextStyle}"
               Text="MEF Module container"/>
    <TextBlock x:Name="ContentText" Style="{StaticResource ContentTextStyle}"
               Text="MEF content"/>
    <ItemsControl x:Name="content"/>
</StackPanel>

Our “MEF Module” is hosted in a “ItemsControl” using the “Items” property:

public MEFModuleContainer()
{
    InitializeComponent();

    CompositionInitializer.SatisfyImports(this);

    CatalogService.AddXap("MEFModule.xap");
}

[Import]
public IDeploymentCatalogService CatalogService { get; set; }

[ImportMany(AllowRecomposition = true)]
public Lazy<UserControl>[] MEFModuleList { get; set; }

#region IPartImportsSatisfiedNotification Members

public void OnImportsSatisfied()
{
    MEFModuleList.ToList()
        .ForEach(module=>
            content.Items.Add(module.Value)
        );
}

#endregion

In order to use the DeploymentCatalog, it’s necessary to define an interface IDeploymentCatalogService (read this post by Glenn Block for more information about it):

public interface IDeploymentCatalogService
{
    void AddXap(string uri, Action<AsyncCompletedEventArgs> completedAction = null);
    void RemoveXap(string uri);
}

and implement it in the class “DeploymentCatalogService“:

[Export(typeof(IDeploymentCatalogService))]
public class DeploymentCatalogService : IDeploymentCatalogService
{
    private static AggregateCatalog _aggregateCatalog;

    Dictionary<string, DeploymentCatalog> _catalogs;

    public DeploymentCatalogService()
    {
        _catalogs = new Dictionary<string, DeploymentCatalog>();
    }

    public static void Initialize()
    {
        _aggregateCatalog = new AggregateCatalog();
        _aggregateCatalog.Catalogs.Add(new DeploymentCatalog());
        CompositionHost.Initialize(_aggregateCatalog);
    }

    public void AddXap(string uri, Action<AsyncCompletedEventArgs> completedAction = null )
    {
        DeploymentCatalog catalog;
        if (!_catalogs.TryGetValue(uri, out catalog))
        {
            catalog = new DeploymentCatalog(uri);
            if (completedAction != null)
                catalog.DownloadCompleted += (s, e) => completedAction(e);
            else
                catalog.DownloadCompleted += catalog_DownloadCompleted;

            catalog.DownloadAsync();
            _catalogs[uri] = catalog;
            _aggregateCatalog.Catalogs.Add(catalog);
        }
    }

    void catalog_DownloadCompleted(object sender, AsyncCompletedEventArgs e)
    {
        if (e.Error != null)
            throw e.Error;
    }

    public void RemoveXap(string uri)
    {
        DeploymentCatalog catalog;
        if (_catalogs.TryGetValue(uri, out catalog))
        {
            _aggregateCatalog.Catalogs.Remove(catalog);
        }
    }
}

The DeploymentCatalogService is initialized during the Application startup in this way:

private void Application_Startup(object sender, StartupEventArgs e)
{
    //Initialize the DeploymentCatalogService for MEF
    DeploymentCatalogService.Initialize();
    this.RootVisual = new MainPage();
}

When the user clicks on the Navigation bar, the container is loaded and filled with the content of the external XAP, all managed by MEF:

So we have a Navigation application which can dynamically load external “MEFModules” organized with a MVVM approach, contained in external XAPs and using an Event Aggregator to exchange messages, all managed by MEF.

This application can be easily extended inserting WCF RIA Services and/or Blend sample data for the design mode.

As usually the sample code is available for download here and will be soon available in the CodePlex project “MEF MVVM” – http://mefmvvm.codeplex.com.

Happy Silverlighting!


Apr 3 2010

Silverlight 4, MEF and MVVM: EventAggregator, ImportingConstructor and Unit Tests

I had recently the possibility to use MEF and Silverlight in a sample project together with Prism, this is for sure a great combination of frameworks for bulding applications using maintainable and extensible code. I don’t think that using MEF excludes the usage of Prism and vice versa,  the choice should be pondered and analyzed accordingly to the problem to solve.

Starting from the previous experiments, I decided to refactor and cleanup the MVVM approach in order to:

  • obtain simpler code;
  • inserting an EventAggregator managed by MEF to exchange messages;
  • maintaining the Visual Studio designer/Blend support;
  • trying a simple unit test using the framework available in the Silverlight Toolkit.
  1. Using the EventAggregator

The first step is inserting in the project the Prism EventAggregator downloading the “Microsoft.Practices.Composite.dll” and “Microsoft.Practices.Composite.Presentation.dll” libraries from the Prism site on Codeplex.

It’s now possible to make available in the application an instance of it using this syntax:

public class EventAggregatorProvider
{
   [Export(typeof(IEventAggregator))]
   public IEventAggregator eventAggregator { get { return new EventAggregator(); } }
}

In this way we are able to import it in the ViewModel class using an [ImportingConstructor] attribute:

[ImportingConstructor]
public MainPageViewModel(IEventAggregator eventAggregator, IDataItemsService dataItemsService)
{
   _eventAggregator = eventAggregator;
   _dataItemsService = dataItemsService;
}

When an [ImportingConstructor] is found, MEF looks for an [Export] for each parameter available in the constructor, in this case we must have exported an “IEventAggregator” and an “IDataItemsService”.

We are now able to access the instance of the EventAggregator and Publish/Subscribe to events using a syntax like:

//Call the Service
_dataItemsService.GetDataItems();

//Subscribe to the "DataItemsReceivedEvent"

_eventAggregator. GetEvent<DataItemsReceivedEvent>(). Subscribe(
    dataItemsReceived =>
    {
        this.dataItems = dataItemsReceived;
    },
    true
);

In this case we are receiving the result of the async calls via the EventAggregator and a DataItemsReceivedEvent:

public class DataItemsReceivedEvent : CompositePresentationEvent<DataItems> {  }

DataItemsService code publishing the Event:

//Initialize the collection
DataItemWcfService.DataItemServiceClient svc = new DataItemWcfService.DataItemServiceClient();
svc.GetDataItemsCompleted += (s1, e1) =>
{
    if (e1.Result != null)
    {
        var dataItems = new DataItems();
        e1.Result.ToList().ForEach(d =>
        {
            dataItems.Add(new DataItem() { Description = d.Description });
        });

        //Publish the DataItems
        _eventAggregator. GetEvent<DataItemsReceivedEvent>(). Publish(dataItems);

        isLoading = false;
    }
};
svc.GetDataItemsAsync();
isLoading = true;
}

2. Maintaining the Visual Studio designer/Blend support

In the previous experiments I enabled design-time data by inserting a new ViewModel class which can create some confusion, so I decided to skip this step and using a unique ViewModel following this approach:

  • the ViewModel parameterless constuctor contains the initialization for data to be used during design time and tests;
  • the other constructor marked with the MEF [ImportingConstructor] attribute enables initialization of services and event aggregator.
[ImportingConstructor]
public MainPageViewModel(IEventAggregator eventAggregator, IDataItemsService dataItemsService)
{
    _eventAggregator = eventAggregator;
    _dataItemsService = dataItemsService;
}

3 – Unit Test

To verify the approach described, I’ve inserted a new “Silverlight Unit Test project” to the solution (note that the “Silverlight Toolkit” must be installed to use this feature) and then a simple Test method containing the following code:

[TestClass]
public class Tests
{
    [TestMethod]
    [Description("Test the creation of a ViewModel and the initialization of Design/Test Data")]
    public void TestViewModelCreation()
    {
        var vm = new MainPageViewModel();
        Assert.IsNotNull(vm);
        Assert.AreEqual(vm.dataItems.Count, 2);
    }
}

Since MEF is only used to compose run-time Parts, I’m not using it in the Unit Tests.

So we have now a new piece of code, which I’ve called a “MEFModule” organized with a MVVM approach and ready for design-time support, unit tests and extensibility: ready to be inserted in a Navigation applicationdynamically loaded and enabled for design time using Blend Sample Data, stay tuned.

The source code is available for download here.

Happy Silverlighting!