/*仅个人理解 F8*/
摘要:
介绍在DNN 3.2.2中,如何利用IMC实现模块间的通信,并粗略说明了IMC的实现原理。请点击标题查看全文。
1. 通信示例
现在假设页面中,点击link模块中的btnSend按钮后,需要将用户输入的text信息发送到blog模块中进行处理,即blog模块需要接收到用户输入的text信息。这里就涉及到link模块和blog模块间的通信问题。
具体实现,如下:
■link模块(事件引发者)
1. 声明Communications 的命名空间
Imports DotNetNuke.Entities.Modules.Communications
2. 需要指定IModuleCommunicator接口
Public MustInherit Class Links
Inherits Entities.Modules.PortalModuleBase
Implements IModuleCommunicator
Implements Entities.Modules.IActionable
3. 定义事件
Public Event ModuleCommunication(ByVal sender As Object, ByVal e As ModuleCommunicationEventArgs) Implements IModuleCommunicator.ModuleCommunication
4. 在btnSend按钮事件中发送ModuleCommunication事件
2 Try
3 ' To raise the event for the intermodule communication you need this code
4 ' Event arguments to send to listeners
5 Dim args As New ModuleCommunicationEventArgs
6 ' Event properties (optional). Use whatever properties you need.
7 ' Property Text: Some text you want to send
8 args.Text = " Some text "
9 ' Property Sender: Sender ' s Identification. Can be the name of the module starting the communication
10 ' Can be used to filter events originating from a specific module
11 args.Sender = " Link "
12 ' Property Target: Target ' s Identification. Can be the name of the module to whom this event is sent
13 ' Can be used to filter events directed to a specific module
14 args.Target = " BLOG "
15 ' Property Value: Any object you want to send to the listeners. You can put whatever object you need in this variable
16 args.Value = " A String Object "
17 ' Property Type: A type specification. Can be used to filter event senders
18 args.Type = Me.GetType.ToString()
19 ' Raise the event (use the same name as defined above)
20 RaiseEvent ModuleCommunication(Me, args)
21 Catch exc As Exception
22 ProcessModuleLoadException(Me, exc)
23 End Try
24 End Sub
25
■blog模块(事件监听者)
1. 声明Communications 的命名空间
Imports DotNetNuke.Entities.Modules.Communications
2. 需要指定IModuleListener接口
Public MustInherit Class BLOG
Inherits Entities.Modules.PortalModuleBase
Implements IModuleListener
Implements Entities.Modules.IActionable
Implements Entities.Modules.IPortable
Implements Entities.Modules.ISearchable
3. 实现事件处理程序
Public Sub OnModuleCommunication(ByVal s As Object, ByVal e As ModuleCommunicationEventArgs) Implements IModuleListener.OnModuleCommunication
Me.txtListen.Text = e.Text.ToString()
End Sub
2.原理
IMC的实现在ModuleCommunication.vb文件中。
IMC存在两个list,一个存放所有事件引发者ModuleCommunicators,一个存放所有事件监听者ModuleListeners
每个模块在加载时,都会调用LoadCommunicator()函数,检查该模块是否实现了IModuleCommunicator接口或者是IModuleListener接口。如果实现了,便加入到上面提到的对应的list中。
2 System.Diagnostics.Debug.WriteLine( " LoadCommunicator " )
3 ' Check and see if the module implements IModuleCommunicator
4 If TypeOf ctrl Is IModuleCommunicator Then
5 Me.Add(CType(ctrl, IModuleCommunicator))
6 End If
7
8 ' Check and see if the module implements IModuleListener
9 If TypeOf ctrl Is IModuleListener Then
10 Me.Add(CType(ctrl, IModuleListener))
11 End If
12
13 End Sub
并利用AddHandler将事件与事件处理程序相关联。
For i = 0 To _ModuleListeners.Count - 1
AddHandler item.ModuleCommunication, AddressOf _ModuleListeners(i).OnModuleCommunication
Next i
由于IMC是广播式发布事件和事件监听。所以对于某个事件是否在该事件处理程序中进行处理,需要在事件处理程序中自行根据参数进行鉴别。
参考:
参考了国外一个url中的介绍,但后来找的时候,一直找不到URL了。