關於事件的訂閱和發布,相信網上已經有很多版本了。基本的原理就是先訂閱事件,將訂閱的事件儲存到特定的容器中,接著,當發布事件的時候,直接呼叫的儲存的事件。
.net不是已經提供了event,為什麼還要做事件的訂閱和發布。
我個人的理解是高度封裝自己的事件,這樣**簡潔美觀,並且易於維護和擴充套件。
我採用了靜態的容器來儲存訂閱的事件,這樣可以跨組建或專案的程式集。
首先我們要定義我們自己的event事件
usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
using
system.windows;
namespace
fyframework.event
//////
publish the event
/// ///
publish's function's parameters
public
virtual
void publish(callmode callmode,object
objs) );}
else
); }
}#endregion
}}
我們自定義的eventbase 只有兩個方法 subscribe和publish
subscribe用來訂閱事件(我們這裡泛指 無返回值的函式,有返回值的函式我會繼續在下個版本加入)
至於fyevent只是個空的抽象類,就是為了實現eventbase的泛型,有好的辦法,大家通知我。
這裡我們會看到eventdispathcher類,主要是個list用來村粗action(無返回函式的委託)
usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
fyframework.event
}//////
remove event
/// ///
event delegate object
public
void
removeevent(fyweakreference weakreference)
}//////
get event
/// ///
public listgetevent()
#endregion
}}
addevent就是用來新增action
在這裡又會有fyweakreference類,就是就是action的weakreference物件。
為什麼用weakreference,用弱引用是盡量的當事件太多時,對於記憶體的壓力。
weakreference的**。
usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.reflection;
using
system.text;
using
system.threading.tasks;
namespace
fyframework.event
public fyweakreference(delegate action, bool
iskeepalive)
else
}#endregion
#region
<< method >>
//////get delegate
/// ///
delegate
public
delegate getaction()
object obj =weakreference.target;
if (obj != null
)
return
delegate.createdelegate(actiontype, obj, methodinfo);
return
null
; }
#endregion
}}
接著就是我們eventmanager.
usingsystem;
using
system.collections.generic;
using
system.componentmodel.composition;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
fyframework.event
}
usingsystem;
using
system.collections.generic;
using
system.componentmodel.composition;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
fyframework.event
}#endregion
}}
這eventmanager我用字典來儲存我們自定義的事件。
getevent泛型來取得對應的事件物件,來進行訂閱和發布。
整個訂閱和發布,其實就是先儲存event,再呼叫event對應的action
目前這個事件小框架,還不太完善,先發出來,大家討論下,希望你們也可以發布自己的事件訂閱和發布框架。