Register  |  
About the author
Baldwin's Status
 Contact Me
Baldwin Sun
Senior Developer for dnn solution & founder of SunBlog module...
Blog搜索
相册库
更多照片请查看相册库
最新评论
Rss Feed
feedsky
抓虾
pageflakes
newsgator
哪吒
我们的服务
  • DotNetNuke 咨询
  • Web设计及其模块开发
  • 免费建站
  • 电子商务
  • 开拓市场
我们致力于开发定制的web 2.0 ,所服务的客户主要包括小中型企业,社区俱乐部及其非盈利机构组织。我们将利用开源的DNN作为我们核心的系统机制,更多相关信息...

DNN特性之IMC

Posted in [DNN模块开发], [优化DNN], [剖析DNN架构] By baldwin

首先,先简单介绍一下何谓IMC, IMC的全称是Inter Module Communication,它主要负责模块之间的通信,比如 A 模块可能需要跟某一个事件激发之后给 B 模块传递一个参数值提示需要更新 B 模块, 传统DNN的做法是由 URL来负责传递对应的参数, 然后B 模块每次加载先解析URL ,判断是否存在相应的参数, 是则更新,相反则不做任何操作. 但如果参数很多,如此以来可能URL就会显得混乱和不友好, 并且 URL 是纯粹的字符串形式, 对传递自定义的业务对象来说就心有余而力不足. 然而这些IMC都能做到. IMC 的原理主要是在事件的产生处(Sender)将消息打包并发送出去, 在事件的接收处(Receiver or Target)再拆开并解析消息. 由此你可看出IMC是一种广播式发布事件和事件监听机制, 发送方(Sender)只管发送消息,所以需要事件的接收处(Receiver or Target)自行根据参数进行解析是否这就是我一直在监听的事件,因为同一个页面可能存在不同的IMC模式通讯。
接下来让我们看看DNN核心代码是如何实现这种机制的,主要代码文件就是Library\Components\Modules\ModuleCommunication.vb, 命名空间为DotNetNuke.Entities.Modules.Communications, 其中包括两个接口IModuleCommunicator和IModuleListener, 一个负责发送消息,另一个负责监听消息.代码如下:
ModuleCommunication.vb
    Public Interface IModuleCommunicator
        Event ModuleCommunication As ModuleCommunicationEventHandler
    End Interface   'IModuleCommunicator
   
    Public Interface IModuleListener
        Sub OnModuleCommunication(ByVal s As Object, ByVal e As ModuleCommunicationEventArgs)
    End Interface   'IModuleListener
 
Public Delegate Sub ModuleCommunicationEventHandler(ByVal sender As Object, ByVal e As ModuleCommunicationEventArgs)
而这真正把这个两者关联起来的是ModuleCommunicate类,这个类存在一个LoadCommunicator方法专门负责加载实现了上述两个接口的控件,也就是存在两个list,一个存放所有事件引发者ModuleCommunicators,一个存放所有事件监听者ModuleListeners.每当模块加载时,都会调用LoadCommunicator方法,检查该模块是否实现了IModuleCommunicator接口或IModuleListener接口。如果实现了添加到对应的list中.
ModuleCommunicate
Public Sub LoadCommunicator(ByVal ctrl As System.Web.UI.Control)
            ' Check and see if the module implements IModuleCommunicator
            If TypeOf ctrl Is IModuleCommunicator Then
                Me.Add(CType(ctrl, IModuleCommunicator))
            End If
 
            ' Check and see if the module implements IModuleListener
            If TypeOf ctrl Is IModuleListener Then
                Me.Add(CType(ctrl, IModuleListener))
            End If
End Sub
而后ModuleCommunicate就会调用下列两个方法分别把对应事件(或发送事件或监听事件)添加到事件处理队列中.
添加事件
Private Overloads Function Add(ByVal item As IModuleCommunicator) As Integer
            Dim returnData As Integer = _ModuleCommunicators.Add(item)
            Dim i As Integer
            For i = 0 To _ModuleListeners.Count - 1
                AddHandler item.ModuleCommunication, AddressOf _ModuleListeners(i).OnModuleCommunication
            Next i
            Return returnData
    End Function       'Add
 
    Private Overloads Function Add(ByVal item As IModuleListener) As Integer
            Dim returnData As Integer = _ModuleListeners.Add(item)
            Dim i As Integer
            For i = 0 To _ModuleCommunicators.Count - 1
                AddHandler _ModuleCommunicators(i).ModuleCommunication, AddressOf item.OnModuleCommunication
            Next i
            Return returnData
End Function       'Add
而在模块开发时其实我们更关心也许不是IMC是如何实现通讯的,而是我如何能够让这两个模块之间进行通讯的,我可以传递参数,参数需要如何设置的等等比较细节的东西,那就必须得利用到了ModuleCommunicationEventArgs类,不知道你是否注意到没,上边两个接口是包含这个对象的(除了Sender之外),也就是ModuleCommunicationEventArgs主要负责参数的初始化及其传递,通过它你可以把你任何想传递的参数及其对象发送出去.下表列举了对象ModuleCommunicationEventArgs的属性:
Type:可自定义的类型标识,它主要表示当前IMC的一个认证标识,好比IMC的发送者和接收者的一个默认信号,凭借它可以把发送者和接收者牵连起来,如此接受者只监听属于它自己类型的事件.
Sender:顾名思义,这就是事件消息的发送者.
Target:事件消息的目标,也就是接收者.
Value:这是一个返回对象类型的属性,也就是IMC的重点所在,也就是你需要传递的参数,它可以是任何复杂的对象类型,比如说Dataset,Control等等,只要该事件的接收者能够解析它.
Text:可选的参数,一个简单的字符串,你可设置附加的参数信息.
 
 
到此IMC的简要分析完毕,接下来下篇文章我将实现如何使用IMC和 Ajax Web Service 结合起来实现无刷新页面的效果. Enjoy...

Comments

Was it good for you, too?Join the discussion » ,but you need to login first before you make comments.