RonaldWidha

percaya sama occam razor
See also: Other Geeks@INDC

May 2009 - Posts

.Net Data Access Layer Undercover – first glance review

I had fun reading the ebook and learning EntityMap as a framework. Guwe nulis ini lebih buat a vehicle untuk nge-formulasi'in pendapat guwe. Mungkin bisa jadi wacana diskusi kita? Open floor...discuss (-8

.Net data access framework undercover adalah buku yang sangat bagus untuk menjelaskan tentang EntityMap framework. Tidak ada yang bisa menjelaskan EntityMap lebih baik dari sang penulisnya sendiri, Ari Yanto (neonerdy). Bagi pembaca yang tidak tertarik dengan menggunakan EntityMap pun bisa tetap mengambil pelajaran-pelajaran tentang praktisi umum bagaimana untuk menulis data access layer.

Komen berikut lebih membahas EntityMap framework itu sendiri seperti digambarkan oleh .Net Data Access Framework Undercover.

Komplit akan Fitur

Dari sepintas lalu, saya bisa melihat framework ini cukup komplit. Menyediakan fitur dari data access sampe logging dan injeksi dependensi.
Syntax dan penggunaannya cukup mudah dicerna untuk para pemakai ADO.net. Beberapa perintahnya pun menggunakan kata kunci yang serupa membuat kurva belajarnya lebih mudah.

EntityMap jg mengakomodasi penulisan fitur yang standar untuk dimiliki setiap data access layer framework modern, seperti persistence ignorance dan lazy/eager loading.

Sederhana

EntityMap bekerja di layer yang cukup rendah. framework ini sepertinya memfokuskan dirinya bagaimana untuk mengkonstruksi sebuah query, eksekusi dan menyediakan titik injeksi untuk membentuk query resultnya kembali menjadi sebuah objek. Kesederhanaannya ini membuat EntityMap menjadi sangat extensible.

Untuk alasan-alasan di atasEntityMap menjadi sebuah alternatif yang cukup menarik untuk data access yang menghasilkan objek strongly type.

Contoh

Perhatikan contoh pemakaian EntityMap framework berikut:
Product dengan Category yang memiliki one to many relationship.

Di repository class ini kita memetakan table name dengan domain model class-nya.

   1:  public class CategoryRepository : ICategoryRepository
   2:  {
   3:    private IEntityManager em;
   4:    private string tableName = "Categories";
   5:    private IProductRepository productRepository; 
   6:   
   7:    public CategoryRepository(IEntityManager em)
   8:    {
   9:      this.em = em;
  10:      productRepository = RepositoryFactory.GetObject<IProductRepository>();
  11:    } 
  12:   
  13:    public Category FindById(object id)
  14:    {
  15:      Query q = new Query().From(tableName).Where("CategoryId").Equal(id); 
  16:   
  17:      Category category=em.ExecuteObject<Category>(q.GetSql(),
  18:      new CategoryMapper()); 
  19:   
  20:      category.Products = productRepository.FindByCategoryId(id); 
  21:   
  22:      return c;
  23:    }
  24:    ...
  25:  } 

Di category Mapper class, kita perlu menghidrasi objek domain model-nya. Secara implisit di sini kita memetakan field dari table categories ke property yang tepat.

   1:  public class CategoryMapper : IDataMapper<Category> 
   2:  { 
   3:    public Category Map(IDataReader rdr) 
   4:    { 
   5:      Category category = new Category(); 
   6:   
   7:      category.CategoryId = rdr["CategoryId"] is DBNull ? 
   8:        0 : (int)rdr["CategoryId"]; 
   9:   
  10:      category.CategoryName = rdr["CategoryName"] is DBNull ? 
  11:        string.Empty : (string)rdr["CategoryName"]; 
  12:   
  13:      return category; 
  14:    } 
  15:  } 

Di parent entity kita juga harus mengimplementasi bagaimana untuk mengeksekusi pencarian parent entity dengan child entity-nya. Di dalam implementasi ini kita secara implisit memetakan asosiasi (foreign key constraint) antara kedua database table tersebut.

Di saat yang bersamaan kita jg secara implisit melakukan pemetaan primary key antara table Category dengan CategoryId.

   1:  public class ProductRepository
   2:  {
   3:    public List<Product> FindByCategoryId(object id)
   4:    {
   5:      Query q = new Query().From(tableName)
   6:        .InnerJoin("Categories", "CategoryId", "CategoryId")
   7:        .Where("Categories.CategoryId").Equal(id);
   8:   
   9:      return em.ExecuteList<Product>(q.GetSql(), new ProductMapper());
  10:  }

Tidak Luput dari Kekurangan

Dari contoh di atas bisa kita lihat EntityMap sayangnya tidak luput dari kekurangan.

Multiple Points of Control

EntityMap tidak menyediakan 1 tempat untuk mendefinisikan pemetaan antara class, properties dengan table dan fieldsnya. Penggunanya akan terdorong untuk menjembatani impedance mismatch ini di 3 tempat yang berbeda: repository class, mapper class dan repository class dari parent entity-nya.

Full Control tapi butuh kerja keras

Kekuatan EntityMap dengan sifatnya yang bekerja di layer yang rendah menjadi sebuah kelemahannya yang terbesar. Design ini mengakibatkan penggunanya untuk masih harus mengimplementasi secara manual lazy/eager loading dan relationship association. Akibatnya penggunanya akan mendapatkan kesulitan untuk memilih lazy atau eager loading secara runtime.

Pembandingan

Beberapa dari kita akan bertanya apa keuntungannya menggunakan framework ini dibandingkan dengan framework yang serupa seperti NHibernate atau Ado.Net Entity Framework.

Terus terang sedikit keuntungan yang saya bisa kemukakan selain framework ini open source dan penulisnya pun ada di dalam negeri yang akan menggaransi dukungan teknis yang tidak ada bandingannya.

Bila dibandingkan dengan NHibernate yang kaya dengan fitur, saya merasa EntityMap mempunyai pesona tersendiri mengingat NHibernate seringkali membawa komplikasi yang tidak dibutuhkan untuk kebutuhan software-software sederhana.

Bila dibandingkan dengan ADO.Net Entity Framework, EntityMap juga menawarkan cerita yang lebih lengkap dari sisi supportnya terhadap Domain Model berbasis POCO (Plain Old CLR Object) dan memungkinkan penggunanya untuk memasukkan behavior (sesuatu yang tidak disupport oleh Entity Framework).

Yang menarik skrg adalah bagaimana bila EntityMap dibandingkan dengan Linq to SQL (atau bahkan linq to Entities). Kita bisa dengan cukup mudah untuk menggantikan EntityMap ke linqToSql (atau linq to Entities) dalam mengimplementasikan pattern yang Ari Yanto gunakan dalam menulis buku ini. Bahkan linq to sql menawarkan sesuatu yang belum mungkin dilakukan oleh EntityMap yaitu Deferred Execution. Dengan Deferred execution, Query asosiasi seperti:
List All Categories of All products tidak akan mengakibatkan O(n^2).
[updated 21/05] Rupanya Deferred execution di linq to sql hanya nama lain dari lazy loading. Jadi in general masih akan memliki masalah O(n+1) untuk nge-list children entities-nya.

Kesimpulan

.Net Data Access Framework Undercover menjadi buku yang menarik untuk belajar tentang menulis data access layer, dan menjadi studi pembandingan yang menarik terhadap platform lain yang ada di pasaran. Kita melihat isu-isu apa yang dialami oleh Data Access platform vendor yang lain. EntityMap framework sendiri menarik untuk dijadikan bahan studi tapi mungkin belum punya proposisi nilai yang cukup besar untuk diadopsi di kalangan komersil.

Share this post: | | | |
Akhirnya punya blog di geeks .net Indonesia

Setelah aktif di mailing list dotnet Indonesia, saya rasa kurang afdol kalo belum punya blog di geeks .net Indonesia jg. Sekalian menjadi outlet untuk tulisan2 berbahasa Indonesia.

Nge-blog itu mayan jadi komitmen waktu yang sangat besar. Semoga saya bisa berhasil ngebagi waktu dan kontribut something ke blog ini.

untuk blog saya berbahasa Inggris:
www.ronaldwidha.net/askbobo

untuk podcast mingguan (terbit setiap senin) berbahasa Indonesia
www.temanmacet.com

 

Share this post: | | | |