Just another side of me

My name is Veri, MSP from ITB. Enjoy my blog...
See also: Other Geeks@INDC

Bing Maps and OData (part 3)

Pada postingan pertama saya tentang Bing Maps dan OData, saya sudah menjelaskan secara garis besar tentang apa itu OData. Pada postingan yang kedua, saya sudah menjelaskan bagaimana membuat sebuah service untuk mengkonsumsi data dari OData. Nah, pada postingan saya yang ketiga ini, saya akan menjelaskan tentang pembuatan ViewModel dan MEF (Managed Extensibility Framework) yang saya gunakan dalam aplikasi ini.

Model-View-ViewModel Design Pattern

Model-View-ViewModel merupakan sebuah pola arsitektur yang digunakan dalam software engineering yang dibuat oleh Microsoft. Model MVVM ini sebenarnya berasal dari model MVC (Model-View-Controller), dimana MVVM lebih ditujukan untuk UI development platform yang modern seperti WPF (Windows Presentation Foundation) dan Silverlight.

MVVM_Relation

Bahasa gampangnya, MVVM ini digunakan untuk memfasilitasi para programmer dalam membangun logic dari sebuah aplikasi dan para designer dalam membuat UX agar mereka dapat bebas berkreasi tanpa harus saling bergantung antar satu sama lainnya.

WLW-TheRevolutionHasBegun_10247-image_2

Pada aplikasi ini, saya memiliki sebuah Model yaitu DinnerViewModel.cs dan sebuah ViewModel yaitu NerdDinnerViewModel.cs. Dalam DinnerViewModel.cs, terdapat objek-objek dari elemen Dinner seperti Title, Location, Address, dll. Sedangkan di dalam NerdDinnerViewModel.cs terdapat fungsi LINQ untuk mengquery Dinner yang didapatkan dengan memanfaatkan service yang telah kita buat pada postingan saya sebelumnya.

Secara keseluruhan, DinnerViewModel.cs akan berisi kode-kode seperti berikut.

   1: using System;
   2: using BingMapsOData.NerdDinnerClient;
   3: using Microsoft.Maps.MapControl;
   4:  
   5: namespace BingMapsOData.ViewModels
   6: {
   7:     public class DinnerViewModel
   8:     {
   9:         public Location Location { get; set; }
  10:         public string Title { get; set; }
  11:         public string Description { get; set; }
  12:         public DateTime Date { get; set; }
  13:         public string Address { get; set; }
  14:         public string HostedBy { get; set; }
  15:         public int Attendees { get; set; }
  16:         public string Phone { get; set; }
  17:         public int DinnerId { get; set; }
  18:  
  19:         public DinnerViewModel(Dinner d)
  20:         {
  21:             Title = d.Title;
  22:             Location = new Location() { Latitude = d.Latitude, Longitude = d.Longitude };
  23:             Address = d.Address;
  24:             HostedBy = d.HostedBy;
  25:             Attendees = d.RSVPs.Count;
  26:             Description = d.Description;
  27:             Date = d.EventDate;
  28:             Phone = d.ContactPhone;
  29:             DinnerId = d.DinnerID;
  30:         }
  31:     }
  32: }

Sedangkan dalam NerdDinnerViewModel.cs akan berisi kode-kode berikut.

   1: using System;
   2: using System.Collections.Generic;
   3: using System.ComponentModel.Composition;
   4: using System.Linq;
   5: using BingMapsOData.NerdDinnerClient;
   6: using BingMapsOData.Services.Data;
   7:  
   8: namespace BingMapsOData.ViewModels
   9: {
  10:     /// <summary>
  11:     /// View model for the nerd dinner
  12:     /// </summary>
  13:     public class NerdDinnerViewModel : ViewModelBase
  14:     {
  15:         #region Methods
  16:  
  17:         /// <summary>
  18:         /// Set the default values
  19:         /// </summary>
  20:         private void InitializeDefaults()
  21:         {
  22:             From = DateTime.Now.Subtract(new TimeSpan(12, 0, 0));
  23:             To = DateTime.Now.AddMonths(1);
  24:             OnPropertyChanged("From");
  25:             OnPropertyChanged("To");
  26:         }
  27:  
  28:         /// <summary>
  29:         /// Ctor
  30:         /// </summary>
  31:         public NerdDinnerViewModel()
  32:         {
  33:             CompositionInitializer.SatisfyImports(this);
  34:             InitializeDefaults();
  35:  
  36:             Service.DinnersChanged += (dinners) =>
  37:             {
  38:                 _dinners = dinners;
  39:                 Status = " | " + dinners.Count() + " Dinners from " + From.ToLongDateString() + " To " + To.ToLongDateString();
  40:                 OnPropertyChanged("Dinners");
  41:             };
  42:         }
  43:  
  44:         /// <summary>
  45:         /// Execute the service query to return the dinners
  46:         /// </summary>
  47:         public void QueryDinners()
  48:         {
  49:             Service.QueryDinners(From, To);
  50:             Status = " | Loading Dinners, Have a cup of tea..";
  51:         }
  52:  
  53:         #endregion
  54:  
  55:         #region Bindable Properties
  56:  
  57:         private IEnumerable<Dinner> _dinners = new List<Dinner>();
  58:  
  59:         private string _status = string.Empty;
  60:         public string Status
  61:         {
  62:             get
  63:             {
  64:                 return _status;
  65:             }
  66:             set
  67:             {
  68:                 _status = value;
  69:                 OnPropertyChanged("Status");
  70:             }
  71:         }
  72:  
  73:         public IEnumerable<DinnerViewModel> Dinners
  74:         {
  75:             get
  76:             {
  77:                 var items = from d in _dinners
  78:                             select new DinnerViewModel(d);
  79:                 return items;
  80:             }
  81:         }
  82:  
  83:         public DateTime From { get; set; }
  84:         public DateTime To { get; set; }
  85:  
  86:         #endregion
  87:  
  88:         #region Imported Services
  89:  
  90:         [Import(typeof(INerdDinnerService))]
  91:         public INerdDinnerService Service { get; set; }
  92:  
  93:         #endregion
  94:     }
  95: }

Mungkin sekarang timbul pertanyaan. Pada part 2, terdapat [Export(typeof(INerdDinnerService))] lalu pada postingan kali ini terdapat [Import(typeof(INerdDinnerService))]. Sebenarnya itu buat apaan sih? Oke, sekarang juga akan saya jelaskan.

Managed Extensibility Framework

Managed Extensibility Framework atau MEF merupakan sebuah library untuk membuat sebuah aplikasi yang ringan dan extensible. MEF memungkinkan para developer untuk membuat extension-extension dari aplikasi tanpa konfigurasi apapun. Selain itu, dengan menggunakan MEF, extension-extension tersebut tidak hanya bisa di re-use dalam sebuah aplikasi tetapi juga dapat digunakan dalam aplikasi lain. MEF ini sudah include di dalam .NET Framework 4 dan Silverlight 4.

MEF_Diagram

Untuk lebih jelasnya tentang pemrograman menggunakan MEF, bisa dilihat disini.

Oke, kayaknya cukup sampai sini dulu deh. Silakan di pelajari sedikit demi sedikit. Tunggu pembahasan selanjutnya ya…

Share this post: | | | |

Comments

No Comments