Membuat aplikasi berbasis plug-in menggunakan Manage Extensibility Framework (MEF)
Tentunya Anda sudah akrab dengan istilah plugin atau add-on, yaitu fungsionalitas yang bisa ditambah ataupun dikurangi terhadap satu aplikasi. Sebagai contoh WinAmp, yang umum dikenal sebagai aplikasi pemutar MP3, dengan bantuan plugin maka fungsionalitas WinAmp tidak hanya sebagai pemutar MP3, tapi bisa juga digunakan untuk mengkonversi MP3 ke format lainnya, menambahkan efek suara tertentu, atau bahkan dapat digunakan untuk bermain game.
Mengembangkan aplikasi yang berbasis plugin menggunakan .NET tidaklah sulit, dengan menggunakan reflection sebetulnya cukup, hanya saja akan sangat sulit untuk dimaintain apalagi jika melibatkan banyak developer
Mengembangkan aplikasi berbasiskan plugin tentunya memiliki beberapa kelebihan, contoh kasus ketika Anda mengembangkan sendiri aplikasi billing warnet dan waktu yang Anda miliki hanya cukup untuk membuat UI dan ‘core’ dari aplikasi itu sendiri, maka fungsionalitas lain seperti Point of Sales, pelaporan, membership dan lain-lain dapat dikerjakan oleh pihak ke-2 (dalam bentuk plugin), dan itupun dapat dilakukan tanpa pihak ke-2 tersebut merubah atau melihat kode buatan Anda. Contoh kasus lain, adalah ketika Anda mengerjakan aplikasi besar yang terdiri dari banyak modul dan dikerjakan oleh banyak developer. Model seperti ini bisa banyak membantu dimana, misalkan dibuat satu aplikasi host dan kemudian tim 1 mengerjakan aplikasi accounting, tim 2 mengerjakan aplikasi sales dan seterusnya.
Mengembangkan aplikasi yang berbasis plugin menggunakan .NET tidaklah sulit, dengan menggunakan reflection sebetulnya cukup, hanya saja akan sangat sulit untuk dimaintain apalagi jika melibatkan banyak developer.
Beberapa waktu lalu Microsoft mengeluarkan framework baru, yaitu Managed extensibility Framework (MEF). MEF adalah satu komponen dalam lingkungan framework .NET yang memungkinkan aplikasi dan komponen-komponennya digunakan secara lebih luas lagi, dari yang biasanya di-compile menjadi file statis, aplikasi/komponen tersebut menjadi tersusun secara dinamis (proses penyusunan/komposisi ini terjadi saat runtime, dan model komposisinya bisa berbeda-beda tergantung dari bagaimana komposisi tersebut dikonfigurasikan). Dari deskripsi tersebut sudah jelas bahwa MEF mengkuti apa yang dinamakan open/closed principle dimana software seharusnya terbuka bagi ekstensi, tapi tertutup bagi modifikasi.
“Known” versus “Unknown”
Karena penggunannya yang deklaratif dan terdapat fitur untuk memungkinkan file-file plugin yang kita buat dapat ditemukan dengan sangat mudah, MEF menjadi sangat powerful untuk digunakan dalam aplikasi, apalagi jika didalamnya terdapat komponen-komponen yang sebetulnya tidak mengenal satu sama lain (atau istilahnya “unknown”) tapi disusun menjadi satu aplikasi yang nyata. Intinya anggap saja MEF sebagai utilitas pihak ketiga yang dapat menambah kemampuan/fitur aplikasi Anda, jadi ketika Anda mendistribusikan aplikasi, Anda tidak memiliki bayangan fungsionalitas apa saja yang dapat ditambahkan ke aplikasi tersebut kedepannya (bisa jadi dalam aplikasi satu ERP yang Anda buat nantinya banyak fitur-fitur baru seperti adanya email client, MP3 player, tetris, video player atau mungkin bisa akses facebook :p …). Nah, itulah kelebihan aplikasi yang “extensible”, dimana fungsionalitasnya dapat ditambah (atau dikurangi) sedemikian rupa.
Jika Anda peduli dengan “known” parts-nya dimana software/komponen disusun dengan saling mengenal satu sama lain pada saat kompilasi, ada banyak solusi lain yang lebih memadai dan powerful untuk skenario seperti itu, yaitu IoC Container (IoC = Inversion of Control), karena MEF didesain lebih ke aspek “unknown”-nya. Untuk lebih detailnya bahwa MEF adalah bukan IOC Container bisa baca post Ayende berikut ini:
http://ayende.com/Blog/archive/2008/09/25/the-managed-extensibility-framework.aspx.
Parts, Catalogs dan Container
Di MEF, aplikasi dibagi menjadi parts. Anda dapat meng-import, export dan menyusun parts ini. Contoh class sederhana adalah sebagai berikut:
Public Class Employee Implements IPayslip Private logger As ILogger Public Function calculatePayslip(employeeID as integer) As Double Handles IPayslip.calculatePayslip logger.writeLog(user.identity.Name & " is running calculatePayslip on Employee " & employeeID) return 0 End Function End Class
Keterangan: Diatas adalah sebuah class employee yang dirinya sendiri ditandai sebagai export, sehingga class tersebut dapat digunakan juga oleh parts lainnya. Parts Employee ini juga menggunakan fungsionalitas logger yang diambil dari part lain (makanya deklarasi logger ditandai sebagai Import).
Sekarang, class diatas sudah ditandai dengan Imports dan Exports, bagaimana dalam aplikasi mereka kemudian bisa mencocokan satu sama lainnya? nah, itu adalah pekerjaannya catalogs dan container. Catalogs akan menyediakan parts, sementara container akan mencocokan parts tersebut dengan kata lain container adalah “comblangnya” :p … Aplikasi kemudian akan meminta container sebuah objek dengan tipe tertentu, kemudian container akan menangani permintaan tersebut dan mengembalikan objek yang dimaksud. Semua proses ini ditangani otomatis oleh container, tanpa perlu campur tangan user.
Hal keren lainnya adalah DirectoryCatalog, kita dapat menggunakannya untuk menemukan semua assembly yang telah ditandai exports dalam satu directory. Jika digunakan bersama dengan FilesystemWatcher kita dapat memonitor folder tertentu dan menambahkan plugin secara runtime tanpa me-restart aplikasi. Demo aplikasi dibawah sudah menyertakan fitur ini, coba jalankan aplikasi lalu pindahkan file (DLL) dari folder plugin ke folder lainnya(kemudian kembalikan lagi) dan perhatikan sub menu Apps pada aplikasi.
Demo aplikasi MEF
Sebagai demonya, saya telah membuat satu solution yang sederhana sebagai berikut ini:
Solusi ini terdiri dari beberapa project :
MyERP, aplikasi utama/host.
MyERP.Interfaces, berisi definisi interface yang digunakan dalam aplikasi.
MyERP.Sales, modul sales (sebagai plug-in).
MyERP.Accounting, modul accounting (sebagai plug-in).
MyERP.Services, service yang digunakan dalam aplikasi, misalnya logging, email, security dan sebagainya.
Catatan : Kecuali ke MEFERP.Interfaces dan assembly MEF, aplikasi ini tidak memiliki ketergantungan/dependencies satu sama lain!
Penutup
Sekarang ini banyak aplikasi komersial mulai mengadopsi MEF, seperti misalnya Office 2010 dan Visual Studio 2010, nah sekarang mungkin sudah saatnya aplikasi Anda “plugin-aware” sehingga akan memiliki banyak fitur menarik kedepannya
Download contoh programnya disini : MyERP (60)
Artikel terkait:
- Mengakses Web Service dengan Aplikasi Windows Mobile
- Membuat sendiri event dan event handler dengan delegate menggunakan VB.NET
- Crosstab Query Menggunakan PIVOT pada SQL Server
- Windows Mobile Industrial Device
- Menangani Event Handler di VB.NET
-
yuniar
-
Danni











