前些天看了一会DNN的代码,觉得对于我来说还是比较的难以理解,特别是它是哪个什么vb.net写的:>其实主要还是看的时候对DNN一点不懂,如果有它的类图,知道它的继承关系,聚合关系等,知道他的特色:比如皮肤和容器的主要作用,有它的系统架构和层次划分的图,那么看起来才是舒服
如果那为牛人大哥辛苦一点,可以提供的给大家:>中国DNN、中国RainBow的牛人们呀看了半天对DNN的通信机制才有个下面的大概了解,也不知道是不是正确,贴出来大家指点一下,不然小弟一路走到底都是错的了,迷途而不知返了DNN的通信主要包括:菜单命令、菜单和模块的通信、模块和模块的通信三种。
1.菜单命令执行有两种:
1. 菜单直接调用ActionBase类提供的逻辑来执行
2. 菜单调用DoAction(),通过Response.Redirect(Command.Url,_cf2 True)来实现
2.模块和模块的通信(通过菜单)
1. 加载(从PortalModuleControl继承的)模块(模块A),模块A的page_load函数中通过skin类的RegisterModuleActionEvent函数将模块注册到skin类的属性ActionEventListeners(侦听者集合)
2. 加载(从 PortalModuleControl继承的)模块B的时候,先找到容器中存在的从ActionBase类继承的控件(比如: DropDownActions.ascx)(动作控件A),然后把模块B动作集合(ModuleActionCollection)中的所有动作(ModuleAction)都加入到动作控件A的ModuleActionCollection集合中去
3. 最后把动作控件A的Action事件委托绑定为skin类中的ModuleAction_Click函数作为执行逻辑
4. 如果有Action事件触发(点击菜单),那么ModuleAction_Click函数在skin类的属性ActionEventListeners(侦听者集合)中遍历所有的ModuleActionEventListener,如果模块是已经注册为listeners,调用相应listener的委托(委托的处理函数是在1步中注册的时候就指定了)
3. 模块和模块的通信(通过ModuleCommunicator)
1. Skin类中包含了一个模块通信器,Private objCommunicator As New ModuleCommunicate
2. 加载模块的时候,执行objCommunicator.LoadCommunicator(objPortalModuleControl),如模块是一个ImoduleCommunicator就加入到通信器的消息发送者结合,如果是一个ImoduleListener就加入到通信器的侦听者集合
3. objCommunicator.LoadCommunicator(objPortalModuleControl)函数内部调用ModuleCommunicate.Add()函数,绑定消息发送者与侦听者之间的委托和处理关系
4. 当作为消息发送者的模块发出消息时,如果找到对应的作为侦听者的模块,那么就执行参考:
IBuySpy Portal Module Communication 
更多的信息:http://authors.aspalliance.com/bbilbro/viewarticle.aspx?paged_article_id=6另:
顺便问一下,昨天看了设计模式的observer,那么钩子函数中的设置系统消息钩子是否也是类试observer的那种模式来实现的,如果有不同?有何不同?利弊?