Subscribe RSS Join our Facebook Group Follow us on Twitter!
in Search

All about GIS

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…

437 Views, 3 Comment(s), Published on: 03-07-2011 21:51 by veri to All about GIS
| More
Filed under: , , , ,

Comments

 

My life as a MSP said:

We meet again fellas. Postingan kali ini merupakan bagian keempat dari postingan saya tentang Bing Maps

March 31, 2011 11:19 AM
 

Just another side of me said:

We meet again fellas. Postingan kali ini merupakan bagian keempat dari postingan saya tentang Bing Maps

March 31, 2011 11:30 AM
 

My life as a MSP said:

This is the last post from a series that talked about Bing Maps and OData . I’ve told you how to retrieve

April 25, 2011 8:51 AM