Mendefinisikan Event Dari Multicast Delegate
14.7. Mendefinisikan Event Dari Multicast Delegate
Dalam pengembangan aplikasi Windows, anda akan sering me nemukan kasus dimana asynch ronous-event processing sangat diperlukan. Beberapa event ini sangat generik, misalnya aplikasi harus mengirim message ke MSMQ disaat user berinteraksi dengan GUI. C ontoh lainnya yang lebih spesifik, ketika in voice dicetak, semua tiket pengambilan barang harus di update. Dalam .NET, skenario asynchronous-event processing dapat diimple mentasikan dengan multicast delegate da n keyword event dalam C#.
Model multicast dele gate berhubungan erat dengan Observer Pattern, atau Publish/Subsc ribe Pattern, dimana suatu class mem-publ ish suatu event yang dapat dimunc ulkan olehnya, dan class lainnya dapat men-subscribe ke event tersebut. Disaat event terjadi, runtime engine akan memberitahu subscriber bahwa event itu terjadi. Method ya ng dipanggil akibat terjadinya suatu event dapat didefinisikan oleh delegate. W alaupun penggunaan delegate dalam kasus ini terkesan mudah, perlu diperhatikan
h al-hal berikut:
D elegate harus didefinisikan dengan dua argument (parameter input) Argument-argument selalu merepresentasikan dua obyek, yaitu obyek yang menyebabkan event (publisher) dan obyek i nformasi event. Obyek kedua harus diturunkan dari class EventArgs yang ada dalam .NET Framework.
Untuk melihat bagaimana implementasi event akan memberikan design sistem yang le bih baik, mari kita lanjutkan contoh Inventory Manager sebelumnya. Kali ini kita ingin m emilik i kemampuan untuk memonitor p erubahan-perubahan pada tingkatan inventory. Salah satu yang termasuk dalam design adalah satu class yang dinamakan InventoryManager yang selalu digunakan untuk meng-update inventory. Class Invent oryM anager ini akan mem-publish suatu event jika yang akan terjadi setiap saat inventory berubah, misalnya dengan adanya penerimaan bahan baku, penjualan dan stock opname. Dengan demikian semua class yang perlu selalu ter-update harus Untuk melihat bagaimana implementasi event akan memberikan design sistem yang le bih baik, mari kita lanjutkan contoh Inventory Manager sebelumnya. Kali ini kita ingin m emilik i kemampuan untuk memonitor p erubahan-perubahan pada tingkatan inventory. Salah satu yang termasuk dalam design adalah satu class yang dinamakan InventoryManager yang selalu digunakan untuk meng-update inventory. Class Invent oryM anager ini akan mem-publish suatu event jika yang akan terjadi setiap saat inventory berubah, misalnya dengan adanya penerimaan bahan baku, penjualan dan stock opname. Dengan demikian semua class yang perlu selalu ter-update harus
us i ng Sy s t em;
c l as s I nv ent or y ChangeEv ent Ar gs : Ev ent Ar gs {
publ i c I nv ent or y ChangeE v ent Ar gs ( s t r i ng s k u, i nt c hange) { th is.sku = s k u; t hi s . c hange = c hange; } s t r i ng sk u;
publ i c s t r i ng Sk u {
g et { r et ur n s k u; }
i nt c hange; publ i c i nt Change {
get { r et ur n c hange; } } };
c l as s I nv ent or y Manager / / Publ i s her { publ i c d el egat e v oi d I nv ent or y ChangeEv ent Handl er ( obj ec t s our c e, I nv ent or y ChangeEv ent Ar gs e) ;
publ i c e v ent I nv ent or y Change Ev ent Handl er
OnI nv ent or y ChangeHandl e r;
publ i c v oi d Updat eI nv ent or y ( s t r i ng s k u, i nt c hange) {
if (0 == c hange) r et ur n; / / Ti dak ada updat e t anpa per ubahan
/ / Kode unt uk updat e da t abas e l et ak k an di s i ni
In v ent or y ChangeEv ent Ar gs e =
new I nv ent or y ChangeEv ent Ar gs ( s k u, c hange) ;
if ( OnI nv ent or y Change Handl er != nul l ) {
Cons ol e. Wr i t eLi ne( " [ I nv ent or y Manager " + " . Updat eI nv ent or y ] Membuat ev ent ke s emua " + " Subs c r i ber . . . \ n" ) ; OnI nv ent or y ChangeHandl er ( t hi s , e) ;
c l as s I nv ent or y Wat c her / / Subs c r i ber { publ i c I nv ent or y Wat c her ( I nv ent or y Manager i nv ent or y Manager ) {
Cons ol e . Wr i t eLi ne( " [ I nv ent or y Wat c her " +
" . I nv ent or y Wat c her ] Subs c r i be ke " + " I nv ent or y Change ev ent \ n" ) ;
t hi s . i nv ent or y Manage r = i nv ent or y Manager ;
i nv ent or y Manager . OnI nv ent or y ChangeHandl er += new
I nv ent or y Manage r . I nv ent or y ChangeEv ent Handl er (
OnI nv ent or y Change) ; OnI nv ent or y Change) ;
I nv ent or y ChangeEv ent Ar gs e) {
i nt c ha nge = e. Change;
Cons ol e. Wr i t eLi ne( " [ I nv ent or y Manager . OnI nv ent or y Chang e] " + " \ n\ t Bahan ' { 0} ' { 1} s eba ny ak { 2} uni t \ n" ,
e. Sk u,
c hange > 0 ? " ber t ambah" : " ber k ur ang" , Mat h. Abs ( e. Change) ) ; }
I nv ent or y Manager i nv ent or y Manager ; }
c l as s Del egat eEv en ts { publ i c s t at i c v oi d Mai n( ) {