DNN特性之IMC

首先 ,先简单介绍一下何谓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 结合起来实现无刷新页面的效果.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15040802/viewspace-419038/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15040802/viewspace-419038/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值