亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

ESFramework介紹之(9)-- 插件對(Addin Pai

系統(tǒng) 1685 0
使用 ESFramework 開發(fā) C/S (通常為 4 層、 3 層也沒問題)應用,當需要增加一項新的業(yè)務時,我們需要做的僅僅是開發(fā)兩個插件,一個是服務端的業(yè)務功能插件(FunAddin),一個是客戶端插件( PassiveAddin ),這兩個插件合在一起稱為 Addin Pair 。開發(fā)這兩個插件,只需要關注于業(yè)務,而其它與業(yè)務無關的比如網絡通信、加密、數據安全,都不用管。 ESFramework 很好的將這些關注點分離開來,使得寫“業(yè)務”插件的程序員的工作變得非常單純,在 ESFramework 介紹之( 8 )-- 客戶端插件 IPassiveAddin 一文給出的一個開發(fā)服務端功能插件和客戶端插件的示例中,大家應該已經體會到這點了。

正如 上文 結尾處提到,當增加一項新的業(yè)務,調試包含了這個新業(yè)務實現的插件對( AddinPair )時非常麻煩,因為在 ESFramework 4 層架構中,服務端功能插件加載于功能服務器( FS )上,客戶端插件加載在客戶端應用程序上,中間的通信還經過了應用服務器(AS)。這樣就要將 AS FS Client 都啟動起來,才能對插件 Pair 進行調試,并且在這樣調試的過程中,很多其它的因素會分散我們的注意力,比如多線程的影響、消息 Hook 的影響等等,這使得調試 Addin Pair 并不輕松,正是由于這個原因,促使我開發(fā)一個插件調試框架來簡化這個麻煩的過程。

我的想法是,在 VS.NET 調試模式中運行這個“插件調試框架”(一個 winForm 應用程序),加載要調試的 Addin Pair ,然后,啟動 “業(yè)務操作窗體”顯示出來,后續(xù)的交互將在兩個插件之間直接進行通信,而 VS.NET 提供了我們跟蹤到加載的插件的源碼中的能力,這樣就可以調試 Addin Pair 了。 “插件調試框架”應用程序的主界面如下:

ESFramework介紹之(9)-- 插件對(Addin Pair)調試“框架”

測試模式中的“異常(功能服務器掉線)”用于模擬找不到對應服務端功能插件的情況。

我們知道,客戶插件( PassiveAddin )通過 IServerAgent 來發(fā)送請求獲取回復,在客戶端應用程序中, IServerAgent 是對底層 Tcp Udp 的封裝。在“插件調試框架”我們提供一個 IServerAgent 的實現給要調試的 PassiveAddin 使用, ESFramework 給出的實現是 AddinBridge 類,它實現了 IServerAgent 接口,并且把 PassiveAddin 提交的請求直接提交給已加載的業(yè)務功能插件處理。 AddinBridge 實現如下:

AddinBridge
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 /// <summary>
2 /// AddinBridge用于將服務端插件和對應的客戶端插件橋接起來,進行調試。
3 /// zhuweisky
4 /// </summary>
5 public class AddinBridge:IServerAgent
6 {
7 public AddinBridge()
8 {
9 }
10
11 #region Property
12 #region FunAddinManagement
13 private IAddinManagementfunAddinManagement = null ;
14 public IAddinManagementFunAddinManagement
15 {
16 set
17 {
18 this .funAddinManagement = value;
19 }
20 }
21
22
23 #endregion
24
25 #region TestMode
26 private TestModetestMode = TestMode.Normal;
27 public TestModeTestMode
28 {
29 set
30 {
31 this .testMode = value;
32 }
33 }
34 #endregion
35
36 #endregion
37
38 #region IServerAgent成員
39 public NetMessageCommitRequest(MessagerequestMsg,DataPrioritydataPriority, bool checkRespond)
40 {
41 if ( this .testMode == ESFramework.Addins.TestMode.FSOffline)
42 {
43 requestMsg.Header.MessageBodyLength = 0 ;
44 requestMsg.Header.Result = ServiceResultType.ServiceIsNotExist;
45 return new NetMessage(requestMsg.Header, null );
46 }
47
48 foreach (IFunAddinfunAddin in this .funAddinManagement.AddinList)
49 {
50 if (funAddin.ServiceKey == requestMsg.Header.ServiceKey)
51 {
52 // 交給功能插件處理
53 return funAddin.DealRequestMessage(requestMsg.ToNetMessage());
54 }
55 }
56
57 requestMsg.Header.MessageBodyLength = 0 ;
58 requestMsg.Header.Result = ServiceResultType.ServiceIsNotExist;
59 return new NetMessage(requestMsg.Header, null );
60 }
61
62 public NetMessageCommitRequest(MessagerequestMsg,DataPrioritydataPriority, int expectResServiceKey)
63 {
64 return this .CommitRequest(requestMsg,dataPriority, true );
65 }
66
67 #endregion
68 }
69
70 /// <summary>
71 /// 調試模式
72 /// </summary>
73 public enum TestMode
74 {
75 Normal,FSOffline
76 }



AddinBridge
借助了 IAddinManagement (插件管理器)來管理已加載的業(yè)務功能插件。

有了
AddinBridge 的支持,“插件調試框架”的實現就非常容易了,我將上圖主界面中的按鈕點擊事件源碼列在下面:

private AddinBridgeserverAgent = new AddinBridge();
private IPassiveAddinpassiveAddin = null ;
按鈕事件處理
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 private void button_server_Click( object sender,System.EventArgse)
2 {
3 this .textBox_server.Text = FileHelper.GetFileToOpen( " 請選擇服務端插件 " , " .dll " );
4 IAddinManagementaddinManager = new AddinManagement();
5 string msg = null ;
6 bool succeed = addinManager.LoadNewAddin( this .textBox_server.Text, out msg);
7 if ( ! succeed || (addinManager.AddinList.Count == 0 ))
8 {
9 MessageBox.Show(msg + " 請重新選擇插件! " );
10 return ;
11 }
12
13 this .serverAgent.FunAddinManagement = addinManager;
14 }
15
16 private void button_passive_Click( object sender,System.EventArgse)
17 {
18 this .textBox_passive.Text = FileHelper.GetFileToOpen( " 請選擇客戶端插件 " , " .dll " );
19 IAddinManagementaddinManager = new AddinManagement();
20 string msg = null ;
21 bool succeed = addinManager.LoadNewAddin( this .textBox_passive.Text, out msg);
22 if ( ! succeed || (addinManager.AddinList.Count == 0 ))
23 {
24 MessageBox.Show(msg + " 請重新選擇插件! " );
25 return ;
26 }
27
28 this .passiveAddin = (IPassiveAddin)addinManager.AddinList[ 0 ];
29
30 this .button_bind.Enabled = true ;
31 }
32
33 private void button_bind_Click( object sender,System.EventArgse)
34 {
35 this .button_server.Enabled = false ;
36 this .button_passive.Enabled = false ;
37 this .button_start.Enabled = true ;
38 this .button_bind.Enabled = false ;
39 }
40
41 private void button_start_Click( object sender,System.EventArgse)
42 {
43 if ( this .radioButton_normal.Checked)
44 {
45 this .serverAgent.TestMode = TestMode.Normal;
46 }
47 else
48 {
49 this .serverAgent.TestMode = TestMode.FSOffline;
50 }
51
52 // 通過反射創(chuàng)建客戶業(yè)務操作窗體
53 FormaddinForm = (Form)Activator.CreateInstance( this .passiveAddin.AddinFormType);
54 ((IPassiveAddinForm)addinForm).Initialize( this .serverAgent, " 000000 " );
55 addinForm.Show();
56 }
57
58 private void button_reset_Click( object sender,System.EventArgse)
59 {
60 this .textBox_passive.Clear();
61 this .textBox_server.Clear();
62
63 this .serverAgent.FunAddinManagement = null ;
64 this .passiveAddin = null ;
65
66 this .button_server.Enabled = true ;
67 this .button_passive.Enabled = true ;
68 this .button_start.Enabled = false ;
69 this .button_bind.Enabled = false ;
70 }
71

你可以在54行代碼處添加斷點,然后就可以跟入兩個插件的源碼中調試了。
需要注意的是,為了VS.NET能順利的進入插件的源碼,在加載插件時,最好直接加載插件工程Debug目錄下的插件dll。

感謝關注!

轉到: ESFramework 可復用的通信框架(序)

ESFramework介紹之(9)-- 插件對(Addin Pair)調試“框架”


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚州色拍拍拍 | 色播性播爱播放影院 | 99热这里精品 | 乱子伦有声小说mp3 仑乱高清在线一级播放 | 最新九九精品 | 99久久国产综合精品女小说 | 免费观看四虎精品国产永久 | 狠狠亚洲| 日本一级毛片视频无遮挡免费 | 久久国产热视频 | www.一区| 久久综合97色综合网 | 成人一级黄色片 | 99在线热播| 久久婷婷五夜综合色频 | 久久噜噜噜久久亚洲va久 | 色播综合| 91精品国产综合久久婷婷 | 国产精品一级香蕉一区 | 国产精品一国产精品 | 久久精品午夜视频 | 亚洲国产精品久久 | 激情在线播放免费视频高清 | 免费爱爱片 | 久久亚洲精品中文字幕 | 欧美成人精品 | 在线免费亚洲 | 伊人精品综合 | 成人网视频| 久久这里一区二区精品 | 色老头老太做爰视频在线观看 | 91亚洲精品国产第一区 | 综合另类| 黄色片网站在线免费观看 | 国产区视频| 欧美日韩一区二区不卡三区 | 亚洲欧美成人永久第一网站 | 久久国产精品久久久久久久久久 | 亚洲一区二区三区香蕉 | 任你干精品视频 | 天天操天天操天天操天天操 |