DNN模块间通信(Inner Modules Comunication)

 

==不习惯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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值