iwanarif

art, technology and everything in between
See also: Other Geeks@INDC
Renungan ga jelas : DAL dan "Vendor lock in"

ada sedikit perenungan yang saya rasakan dalam menyelami data access layer selama ini. terus terang data access layer saya anggap hal yang penting dalam membangun aplikasi yang menggunakan repository, apapun bentuknya.

Konsep2 yang mengulas issue di layer ini pun bermunculan satu persatu, mulai dari active record, orm dan lain sebagainya. Begitu banyak konsep2 yang istimewa dan satu sama lain saling melengkapi.

Saya melihat, di pihak penyedia platform language, banyak  membuat pendekatan pada data access layer menjadi hal suatu hal yang generik dan tidak lagi tergantung pada provider repositorynya (contohnya linq as first class query). dengan ini diharapkan kita sebagai programmer tidak lagi perlu tahu masalah akses database yang spesifik ke salah satu vendor (tsql,plsql) , cukup menggunakan satu bahasa yang universal.

Tapi mempukah usaha ini sustained dan berlaku seterusnya? analogi saya sederhana, maaf kalau dirasa dangkal menurut para pembaca.

saya mau bercerita mengenai system.data. kita tahu sekarang ada dua turunan system.data yang sering dipakai, ada system.data.sqlclient dan ada system.data.OraclceClient. Semua dikeluarkan Ms untuk membantu pengembang dalam melakukan akses pada dua database diatas.

Tapi pada kenyataannya. Database vendor juga bukan vendor yang tanpa inovasi. untuk mensupport full potensi dari sebuah database provider bukanlah suatu hal yang mudah, dan penyedia dal library juga harus berkejar2an dengan database provider, yang selama ini saya lihat selalu TERLAMBAT. Inilah mengapa banyak para developer yang beralih menggunakan provider native milik database vendor.

Saya termasuk programmer yang sering bersifat naas. banyak aplikasi yang dikembangkan kadang2 memiliki cross platform yang tinggi (languange x, database y). Biasanya pada posisi ini sering terjadi rintangan2, dan biasanya di drive dengan egoisitas yang tinggi dari masing2 vendor, atau dalam bahasa jawanya "VENDOR LOCK IN". dan alesannya cuman satu , "BISNIS".

Saya ingat tahun 99 sampai 2002 , ada cerita dua vendor software paling terkenal didunia yangs atu pemiliknya orang nomer 1 terkaya dan yang kedua pemiliknya orang kedua terkaya (saya lupa versi forbes tahun berapa). Heheheh, saat itu perusahaan orang kedua terkaya itu mengusung jargon baru "unbreakable linux" , kemudian mulai mengembrace "java" sebagai salah satu languange plat form yang paling asik bersanding dengan databasenya. Sedangkan si orang kaya nomer satu perusahaannya sepertinya mendrive semua aplikasi pada OS dan database miliknya.

Persaingan ini tidak lama, selang dua tahun dalam salah satu publikasinya si orang kedua terkaya dimuat cover story "X dan Y Getting the best of both worlds". hahahha.

Menurut saya dunia akan jauh lebih indah jika hanya ada 1 Os, 1 application stack, dan satu jenis database.
pertanyaannya, Mungkinkah hal ini akan terjadi, kalau iya ... kapan?

Share this post: | | | |
Data Access Application Block part1

Data Access Application Block (DAAB) merupakan application block tertua di keluarga enterprise library. awal kemunculanya application block ini hanya berperan sebagai helper class untuk mengakses database sqlserver. Kini DAAB mampu melakukan akses kepada oracle db2 dan sql compact edition. dengan beragam fitur seperti manajemen connection string, suuport terhadap type dataset, fungsi manipulasi db dengan batch size dan lain sebagainya. Semua ini diberikan dengan menggunakan helper yang lebih generik dan dapat dipergunakan pada beberapa database dengan hanya mengubah sedikit konfigurasi dan nilai dari dbcommand (sql string).

contoh sederhana (rada caur tanpa intellisense :) ):

public void DaftarPelanggan(string nama, string alamat, date tanggal)
{
Database db = DatabaseFactory.CreateDataBase("Pelanggan");
string sql = "insert into table pelanggan (nama,alamat,tanggaldaftar) values (:nama, :alamat, :tanggal)"
DbCommand dbCommand = db.GetSqlCommand(sql);
db.addInParameter(dbCommand,"nama",DbType.String, nama);
db.addInParameter(dbCommand,"alamat",DbType.String, alamat);
db.addInParameter(dbCommand,"tanggal",DbType.Date, tanggal);
db.ExecuteNonQuery(dbCommand);
}


penjelasan:

DatabaseFactory.CreateDataBase("Pelanggan") -> maksudnya instantiate database dengan konnection string bernama "pelanggan" sesuai yang tercantum pada konfigurasi.

input parameter pada sql diberikan tanda ":"

kemudian input parameter ini diisikan dengan menggunakan
db.addInParameter(dbCommand,"nama",DbType.String, nama);

jika kita mengakses jenis sql dalam store procedure kita bisa melakukan mapping parameter baik input, output, mapun inputOutput
contoh :
string sp = "GetNamaPelangganById"
DbCommand dbCommand = db.GetStoredProcCommand(sp);
db.AddInParameter(dbCommand, "id" , Dbtype.Int16, nilaiId);
Db.AddOutParametr(dbCommand, "nama" , DbType.String)
db.ExecuteNonQuery(dbCommand);
return (string)db.GetParameterValue(dbCommand, "nama");

kalau dilihat contoh diatas sangat self explanatory. dapat dilihat bahwa application block ini cukup memudahkan kita dalam melakukan akses database. bagi para penggemar ibatis dapat dilihat bahwa mapping yang dilakukan hampir sama , yaitu mappinfg sql , mapping parameter (baik input ataupun ouput), bedanya tidak ada mapping ke return objek (result maps dalam ibatis)
.
untuk query yang menghasilkan table row , kita dapat menggunakan fungsi dbExecuteReader dan Db.ExecuteDataset, Jika menggunakan reader hasil querynya nanti dapat kita iterate dan kita iskan secara manual pada strongly type collecction kita.

DAAB vs NHIBERNATE vs LIQ to Emtities

Ada bermacam2 data access layer yang populer saat ini. Ada SubSonic ada Ibatis ada NHibernate dan lain sebagainya. Namun sangat jelas disini bahwa perlakukan data access application block sanget berbeda sekali dengan nhibernate kanrena kita tidak melakukan mapping objek. semua akses kedalam db dilakukan secara konvensional menggnukan command sql baik dengan store procedure ataupun bukan. kemudian di DAab ini tidak ada query khusus bawaan library seperti halnya nhibernate maupun subsonic. kalau saya perhatikan DAAB justru lebih mirip ibatis tanpa xml.

Untuk sebaian orang, termasuk saya, cara ini saya anggap paling pantas untuk melakukan akses dan manipulasi database. jika anda termasuk orang yang sering mengembangkan database driven application pasti sudah berpengalman dengan jenis2 complex query, store procedure yang rasanya sangat sulit dihilangkan ataupun dibuat generic, fitur2 query native yang memang spesial (sudah coba bulk copy di Oracle?) dan bagi saya pribadi , kecepatan store proceudre dalam memproses data belum bisa dikalahkan dengan cara apapun, store procedure membuat sebuah aplikasi memiliki roundtrip yang kecil sekali atau bahkan tidak ada. Apalagi melakukan support pada sistem yang dibangun dengain desain data yang sangat relasional dan kita tidak memiliki kuasa melakukan perubahan secara menyeluruh..

Dengan ini saya beranggpan, bahwa cara konvensional ini akan tetap "here to stay" . Linq to entoties maupun nhibernate memang memudahkan kita dalam membangun aplikasi yang domain driven. Namun untuk mendpatkan desain aplikasi yang benar2 domain driven bukanlah pekerjaan yang gampang. JIka anda pengguna Nhibernate saya ucapkan selamat jika dalam aplikasi anda tidak ada native query sedikitpun , berati tujuan anda tercapai.

Just my 50 cent, I need Comment from you ORM Guy :).

Share this post: | | | |
extending configuration block part 2

bagi teman2 yang tertarik untuk me- extend configuration block , misalnya agar bisa menulis di databse selain sql server, mungkin bisa meraba2 sesuai dengan pengalaman saya.

1. Buka source code enterprise library untuk bagian quickstart. disana ada satu projek judulnya sqlconfiguration. buka , copy dan jadikan projek yang lain sebagai projek utak atik kita.

2. pada quickstart tersebut ada script untuk membentuk objek2 yang diperlukan pada sqlserver db. Terjemahkan sql ini menjadi sql yang sesuai dengan database kita. ada 5 database objek, satu tabel configuration parameter dan sisanya 4 storeprosedur untuk menyimpan, meremove, mengambil dan notifikasi update. sebagai base pengalaman, saya mencoba merubah objek database sqlserver ini menjadi oracle. tidak ada kesulitan yang berarti, hanya ada tricki di maslaah penyimpanan field xml pada db, di sql server menggunakan tipe text biasa sedangkan saya mencoba merubah nya mejadi clob yang perlakukan sedikit berbeda (clob null? empty? )

3. kemudian kita lakukan modifikasi pad configuration application block. yang perlu diperhatikan adalah kita harus merubah code data acess pada konfiguration block yang memanipulasi dtabase sql server, anda hanya perlu merubah code tersebut yang tadinya menggunakan system.data.sqlclient menjadi system.data.oracleclient. (kalau ingin oracle) jangan lupa modifikasi code nya sehingga mampu mengakses dan memanipulasi db oracle.kalau ingin bertambah repot sedikit, lakukan seprti yang saya lakukan yaitu ganti total system.data.racleclient dengan provider native oracle seperti oracle.data.accessclient jika anda lakukan hal ini maka ada sedikit modifikasi pada data access application block (postingna selanjutnya). file program yang perlu dipelototi adalah : SQLConfigurationSystem.cs , SqlConfigurationData.cs, ConfigurationChangeSqlWatcher.cs, ketiga file ini semua berada di projek SQL.Configuration.Source.

4. jika semua ssudah settle, jangan lupa jalankan test fxture bawaan configuation block ini. pada fitrst attemtp mungkin anda tidak langgsung lulus test keseluruhan, lakukan perbaikan sana sini hingga anda lukus sratus persen test.

Jika anda megikuti cara ini dengan baik, maka saya percaya bahwa anda  dapat melakukan modifikasi konfigurasi block  sehingga dapat ditulis di databas emanapun misalnya mysql, postgre dan lain sebagainya.

Jika anda pertanyaan ataupun komen silahkan taruh di ruang komen saja yah :), more than happy to respond.

Share this post: | | | |
Configuration application block dalam prakteknya, extending part 1

Jantung dari Entpriselibrary ini adalah konfigurasi. Saya ingat beberapa tahun anglalu saya sempat terlibat dlam pengembangan sebuah proyek dengan menggunakan framework spring dan nhibernate. Saat itu senior saya benar2 mumpuni dalam melakukan wiring keseluruhan framework ini pada proyek kita ( gr33ts 2 omwok..:) ). pada saat itu saya kurang begitu cinta dengan perilaku Spring, cuman satu keberatan saya : !.TOO MUCH CONFIGURATION.

 hasil konfigurasi entlib

(gambar yang di enkrip ga usah diliat, itu maksudnya hasil konfigurasi bisa di enkripsi saja)

cmon guys hand written xml conguration is not that fun, dan untuk skala proyek besar, maka kit aakan hasilkan berlembar2 konfigurasi xml, gemana tuh maintenancenya, bacanya aja susah. Naaaaaaaa... makanya saat saya melihat approach pnp gorup terhadap masalah ini, saya langsung jatuh cinta. Kini di entlib kita tidak perlu melakukan konfigurasi secara manual, karena sudah disedikan tools konfigurasi yang dilakukan pada saat design time. hebatnya, tools ini dapat kita bentuk dan kita kustomisasi sesuai dengan keinginan kita. intinya satu. no more hand written xml, dan semua nilai terlihat pada parameter di GUI konfiguration tools, yaa kalau pun ada tidak terlalu banyaklah

configuration tools

Saat saya pertama mendekat ke entlib, saat itu cuman satu yang ada di otak saya. baga8imana caranya suaya hasil xml konfiurasi ini tidak hanya tertulis  pada file base xml cnfig. untungya pada entlib 4,1 ada source code quickstar example yang membuat konfigurasi dapat ditliskan pada database sqlserver.cantik!, berarti saya tinggal modifikasi agar konfigurasi dapat dituliaskan pada database oracle.

pada quickstart tersebut ada script untuk membentuk objek2 yang diperlukan ada sqlserver db, lalu saya terjemahkan pada db oracle, untuk tabel sangat mudah sekali, hanya saja field text pada sql server saya rubah menjadi clob pada oracle. sedangkan untuk store procedure ada 4 store procedue yang perlu kita rubah.

kemudian kita laukan modifikasi pad configuration application block. yang perlu diperhatikan adalah kita harus merubah code data acess pada konfiguration block yang memanipulasi dtabase sql server, anda hanya perlu merubah code tersebut yang tadinya menggunakan system.data.sqlclient menjadi system.data.oracleclient. jangan lupa modifikasi code nya sehingga mampu mengakses dan memaniulasi db oracle.kalau ingin bertambah repot sedikit, lakukan seprti yang saya laukan yaitu ganti total system.data.racleclient dengan provider native oracle seperti oracle.data.accessclient jika anda lakukan hal ini maka ada sedikit modifikasi pada data access application block (postingna selanjutnya).

jika semua ssudah settle, jangan lupa jalankan test fxture bawaan configuation block ini. pada fitrst attemtp mungkin anda tidak langgsung lulus test keseluruhan, lakukan perbaikan sana sini hingga anda lukus sratir persen test.

Jika anda megikuti cara ini dengan baik, maka saya percaya bahwa anda  dapat melakukan modifikasi konfigurasi block  sehingga dapat ditulis di databas emanapun misalnya mysql, postgre dan lan sebagainya.

detail extending configuration block , akan dijelaskan pada postingan ke 2

Share this post: | | | |
Mengenal enterprise library

saat postingan ini diturunkan pattern and practice group sudah menelurkan versi 4.1 selama 2 tahun terhitung dari mulainya masa inception.

enterprise library ini adalah suatu framework yang berdiri diatas environment framework yaitu .net framework. lalu memngapa ada kerangka kerja diatas kerangka kerja?. Sebenarnya dengan menggunakan framework utama bawaan micrsrosift , developer sudah dapat dengan mudag nelakukan aktivitas pengembangan software. Namin sejalan dengan bergulirnya waktu, dan berdasarkan pengelaman pengembang2 terdahulu, didapatkanlah suatu pola yang common dalam menghadapi isu2 seputar pengembangan software. bagaimana strategi menghaapi validasi, beagaimana strategi melakukan eksepsi , mendesain losely coupled system, bagaimana strategi dalam membentuk software yang benar2 reusable, efektif dan jika terdiri dari beragai komponen memiliki nilai seperation of concern yang tinggi, dan hal2 penting lain lainnya.

Enterprise library mincul menjawab pertanyaan2 ini, dengan suatu metoda yang teruji dan cocok diterapkan pada software berskala besar dan kompleks. Jika kita mau melihat bagaimana memebntuk suatu arsitektir sofware yang benar2 baik sesuai dengan tujuan awal arsiektu itu sendiri, maka kita dapa tmelihat dokumen pnp group seperti app architeture 2.0.

Sebenarnya framweok el41 ini bukan barang baru di dunia sofware development, mungkin ada banyak pembaca disini yang sudah akrab benar dengan spring framework. MS memang bukan pionir dalam hal ini, namun dalam pengamatan saya selama ini, saat ms turun dengan pnpgorupnya maka dapat dipastikan kolaborasi community dan ms disini daat menciptakn suatu barang yang tidak kalah mumpuni dan "mudah digunakan" beserta dukungan support dan dokumen yang sangat jelas dan rapih, terus terang disiniah letak kekuatannya.

dalam enterprise libray terdapat beberapa application block yang dapat membantu penembang dalam melakukan trategi secra terukur dan terarah.,

1.Data Access Applicatiob Block
2. Cahing Application Block
3. Exceptin application block
4. Logging Application Block
5.Cryptography
6. Validation Application Block
7.Policy injection application block

plus 3 modul ekstra behind the scene
Configuration block
application block software factory
Unity.

postingan berikutnya "Configuration application block dalam prakteknya"

Share this post: | | | |
hello world !

setelah sekian lama menjadi penonton, saya putuskan hari ini untuk join di .netindonesia. Mudah2an blog ini dapat menjadi sarana saya dalam pembelajaran, sebagimana saya melihat dan mempelajari blog2 teman2 lainnya.

Rencananya saya mau curhat masalah pengembangan software yang saya alami di kantor saya. Mungkin saya akan sedikit bercerita tentang petualangan saya dengan  framework dan masalah arsitektur, contohnya dengan enterprise library, unity dan produk2 pattern practice lainnya. Dan tidak tertutup kemungkinan isu2 general yang mungkin timbul didalam kehidupan kita sebagai pengembang.

Sekian dulu ah, udah mau magrib . besok2 disambung lagi. hmmm tapi start dari mana ya?

Share this post: | | | |