==不习惯URL传参方式。因为安全性也因局限性。
===================我们站在巨人的肩膀上。
===============或许我们把DNN想得太简单。
首先,先简单介绍一下何谓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:可选的参数,一个简单的字符串,你可设置附加的参数信息.
trackback:http://www.googlecnblog.cn/cmd.asp?act=tb&id=76&key=05296