2///IPas" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

ESFramework介紹之(8)-- 客戶端插件IPassiv

系統 1652 0
前文 已經提到了,在 IServerAgent 的基礎上,客戶端也可以采用插件的結構形式,客戶端插件需要實現 IPassiveAddin 接口。
我的想法是,當客戶端主程序加載一個新的 PassiveAddin 時,可以在某個菜單的子Items上添加一項,當雙擊這個子菜單項時,則彈出該客戶端插件提供的“業務操作窗體”。這只是使用客戶端插件的可行方式之一,你完全可以根據你的應用來決定使用形式。 IPassiveAddin 接口定義如下:

1 /// <summary>
2 /// IPassiveAddin用于客戶端的插件。通常一個PassiveAddin對應著一個服務端的功能插件FunAddin
3 /// zhuweisky2006.03.13
4 /// </summary>
5 public interface IPassiveAddin:IAddin
6 {
7 TypeAddinFormType{ get ;} // AddinFormType必須實現IAddinForm接口
8 }
9
10 public interface IPassiveAddinForm
11 {
12 // PassiveAddin通過IServerAgent發送請求并獲取結果
13 void Initialize(IServerAgentserverAgent, string userID);
14 }

IPassiveAddin 直接從 IAddin 繼承,僅僅增加了一個屬性 AddinFormType ,這個屬性就是前面說的客戶端插件提供的“業務操作窗體”。“業務操作窗體”必須從 IPassiveAddinForm 接口繼承。
“業務操作窗體”只有通過暴露的 Initialize 方法獲取 IServerAgent 引用后,才能發送請求獲取結果。 Initialize 方法的第二個參數說明當前時哪個用戶在操作,這樣客戶端插件在構建請求消息時,需要將 userID 填充到請求消息的消息頭中去,這樣服務器才會知道這個消息的來源。

下面的代碼說明了客戶端主程序是如何加載 IPassiveAddin 的:
1 private void LoadPassiveAddins()
2 {
3 this .lIToolStripMenuItem_addin.DropDownItems.Clear();
4
5 string directory = System.IO.Directory.GetParent(System.Windows.Forms.Application.ExecutablePath).FullName;
6 this .addinManagement.LoadAllAddins(directory, true );
7
8 foreach (IAddinaddin in this .addinManagement.AddinList)
9 {
10 IPassiveAddinpassiveAddin = addin as IPassiveAddin;
11 if (passiveAddin != null )
12 {
13 ToolStripItemitem = new ToolStripMenuItem(passiveAddin.ServiceName, null , new EventHandler( this .OnAddinMenuClicked));
14 item.Tag = passiveAddin;
15 this .lIToolStripMenuItem_addin.DropDownItems.Add(item);
16 }
17 }
18 }
19
20 private void OnAddinMenuClicked( object sender,EventArgse)
21 {
22 try
23 {
24 ToolStripItemitem = (ToolStripItem)sender;
25 IPassiveAddinpassiveAddin = (IPassiveAddin)item.Tag;
26 FormaddinForm = (Form)Activator.CreateInstance(passiveAddin.AddinFormType);
27 ((IPassiveAddinForm)addinForm).Initialize( this .tcpServerAgent, this .currentUserID);
28 addinForm.Show();
29 }
30 catch (Exceptionee)
31 {
32 ee = ee;
33 }
34 }

上述的介紹沒有什么難點,仔細體會一下都能明白,就不多說了。這里我給出一個測試用的功能插件和對應的客戶端插件示例。 示例的功能插件用于從 http://www.webservicex.net/globalweather.asmx 通過 WebService 獲取城市的天氣信息,而客戶端插件則用于為用戶提供這項服務。

先看服務端功能插件實現:

WeatherPreAddin
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 public class WeatherPreAddin:IFunAddin
2 {
3 private IContractHelpercontractHelper = new ContractHelper();
4
5 public WeatherPreAddin()
6 {
7
8 }
9
10 #region IAddin成員
11
12 public string ServiceName
13 {
14 get
15 {
16 // TODO:添加WeatherPreAddin.ServiceNamegetter實現
17 return " 天氣預測服務 " ;
18 }
19 }
20
21 public void OnLoading()
22 {
23 // TODO:添加WeatherPreAddin.OnLoading實現
24 }
25
26 public string CatalogName
27 {
28 get
29 {
30 // TODO:添加WeatherPreAddin.CatalogNamegetter實現
31 return "" ;
32 }
33 }
34
35 public int ServiceKey
36 {
37 get
38 {
39 // TODO:添加WeatherPreAddin.ServiceKeygetter實現
40 return 987 ;
41 }
42 }
43
44 public string Description
45 {
46 get
47 {
48 // TODO:添加WeatherPreAddin.Descriptiongetter實現
49 return "" ;
50 }
51 }
52
53 public void BeforeTerminating()
54 {
55 // TODO:添加WeatherPreAddin.BeforeTerminating實現
56 }
57
58 public bool Enabled
59 {
60 get
61 {
62 // TODO:添加WeatherPreAddin.Enabledgetter實現
63 return true ;
64 }
65 set
66 {
67 // TODO:添加WeatherPreAddin.Enabledsetter實現
68 }
69 }
70
71 public float Version
72 {
73 get
74 {
75 // TODO:添加WeatherPreAddin.Versiongetter實現
76 return 1 ;
77 }
78 }
79
80 public string AddinType
81 {
82 get
83 {
84 // TODO:添加WeatherPreAddin.AddinTypegetter實現
85 return null ;
86 }
87 }
88
89 public AddinAppendixInfoAddinAppendixInfo
90 {
91 get
92 {
93 // TODO:添加WeatherPreAddin.AddinAppendixInfogetter實現
94 return null ;
95 }
96 }
97
98 #endregion
99
100 #region IDataDealer成員
101
102 public ESFramework.Network.NetMessageDealRequestMessage(ESFramework.Network.NetMessagereqMsg)
103 {
104
105 try
106 {
107 string url = " http://www.webservicex.net/globalweather.asmx " ;
108 string []args = new string [ 2 ];
109 args[ 0 ] = this .contractHelper.GetStrFromStream(reqMsg.Body,reqMsg.BodyOffset,reqMsg.Header.MessageBodyLength);
110 args[ 1 ] = " China " ;
111 object result = WebServiceHelper.InvokeWebService(url, " GetWeather " ,args);
112
113 XmlParserparser = new XmlParser(result.ToString(), null );
114 WeatherPredictionContractbody = new WeatherPredictionContract( this .contractHelper);
115 body.Pressure = parser.GetSingleLayerConfigValue( " Pressure " );
116 body.PressureLen = this .contractHelper.GetBytesFromStr(body.Pressure).Length;
117
118 body.PreTime = parser.GetSingleLayerConfigValue( " Time " );
119 body.PreTimeLen = this .contractHelper.GetBytesFromStr(body.PreTime).Length;
120
121 body.Temprature = parser.GetSingleLayerConfigValue( " Temperature " );
122 body.TempratureLen = this .contractHelper.GetBytesFromStr(body.Temprature).Length;
123
124 body.Visbility = parser.GetSingleLayerConfigValue( " Visibility " );
125 body.VisbilityLen = this .contractHelper.GetBytesFromStr(body.Visbility).Length;
126
127 body.Wind = parser.GetSingleLayerConfigValue( " Wind " );
128 body.WindLen = this .contractHelper.GetBytesFromStr(body.Wind).Length;
129
130 reqMsg.Header.MessageBodyLength = body.GetStreamLength();
131
132 return new NetMessage(reqMsg.Header,body.ToStream(), 0 );
133
134 }
135 catch (Exceptionee)
136 {
137 ee = ee;
138 reqMsg.Header.MessageBodyLength = 0 ;
139 reqMsg.Header.Result = ServiceResultType.FailureByOtherCause;
140 return new NetMessage(reqMsg.Header, null );
141 }
142 }
143
144 #endregion
145 }

主要是 DealRequestMessage 方法 的實現,代碼非常簡單,通過WebService獲取指定城市的天氣情況,將返回的XML解析封裝成IContract,然后返回給客戶端。

接下來看客戶端插件的實現,分為兩步: 首先是“業務操作窗體”界面設計
ESFramework介紹之(8)-- 客戶端插件IPassiveAddin

該窗體要從IPassiveAddinForm接口繼承。當點擊按鈕時,處理代碼為:

button1_Click
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> privatevoidbutton1_Click(objectsender,System.EventArgse)
{
stringcityName=ESFramework.Common.ChsToSpellConverter.Convert(this.comboBox1.SelectedItem.ToString());
WeatherReqContractbody=newWeatherReqContract(this.contractHelper);
body.cityName=cityName;
MessageHeaderheader=newMessageHeader(this.contractHelper);
header.TypeKey=int.Parse(this.textBox_asCityCode.Text.Trim());
header.ServiceKey=987;
header.UserID=this.curUserID;
header.UserIDLen=this.contractHelper.GetBytesFromStr(this.curUserID).Length;
header.MessageBodyLength=body.GetStreamLength();

ESFramework.Network.Messagemsg=newESFramework.Network.Message(header,body);
NetMessageresMsg=this.theAgent.CommitRequest(msg,DataPriority.Common,true);
if(resMsg.Header.Result!=ServiceResultType.ServiceSucceed)
{
MessageBox.Show("沒有發現對應的服務~!");
return;
}

WeatherPredictionContractresContract=newWeatherPredictionContract(this.contractHelper);
resContract.FillMyself(resMsg.Body,resMsg.BodyOffset);

this.groupBox1.Text="服務結果--"+this.comboBox1.SelectedItem.ToString();

this.label_pressure.Text=resContract.Pressure;
this.label_temp.Text=resContract.Temprature;
this.label_vis.Text=resContract.Visbility;
this.label_wind.Text=resContract.Wind;
this.label_time.Text=resContract.PreTime;
}

注意,theAgent成員即是通過Initialize傳入的IServerAgent引用!


接著是
IPassiveAddin 實現:
WeatherPassiveAddin
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 public class WeatherPassiveAddin:IPassiveAddin
2 {
3 public WeatherPassiveAddin()
4 {
5 }
6
7 #region IPassiveAddin成員
8
9 public TypeAddinFormType
10 {
11 get
12 {
13 return typeof (AddinForm);//AddinForm即前面實現的業務窗體
14 }
15 }
16
17 #endregion
18
19 #region IAddin成員
20
21 public string ServiceName
22 {
23 get
24 {
25 // TODO:添加WeatherPassiveAddin.ServiceNamegetter實現
26 return " 天氣預測服務 " ;
27 }
28 }
29
30 public void OnLoading()
31 {
32 // TODO:添加WeatherPassiveAddin.OnLoading實現
33 }
34
35 public string CatalogName
36 {
37 get
38 {
39 // TODO:添加WeatherPassiveAddin.CatalogNamegetter實現
40 return null ;
41 }
42 }
43
44 public int ServiceKey
45 {
46 get
47 {
48 // TODO:添加WeatherPassiveAddin.ServiceKeygetter實現
49 return 987 ;
50 }
51 }
52
53 public string Description
54 {
55 get
56 {
57 // TODO:添加WeatherPassiveAddin.Descriptiongetter實現
58 return null ;
59 }
60 }
61
62 public void BeforeTerminating()
63 {
64 // TODO:添加WeatherPassiveAddin.BeforeTerminating實現
65 }
66
67 public bool Enabled
68 {
69 get
70 {
71 // TODO:添加WeatherPassiveAddin.Enabledgetter實現
72 return true ;
73 }
74 set
75 {
76 // TODO:添加WeatherPassiveAddin.Enabledsetter實現
77 }
78 }
79
80 public float Version
81 {
82 get
83 {
84 // TODO:添加WeatherPassiveAddin.Versiongetter實現
85 return 1 ;
86 }
87 }
88
89 public string AddinType
90 {
91 get
92 {
93 // TODO:添加WeatherPassiveAddin.AddinTypegetter實現
94 return null ;
95 }
96 }
97
98 public AddinAppendixInfoAddinAppendixInfo
99 {
100 get
101 {
102 // TODO:添加WeatherPassiveAddin.AddinAppendixInfogetter實現
103 return null ;
104 }
105 }
106
107 #endregion
108 }

需要格外注意要實現AddinFormType屬性,就是前面實現的“業務窗體”類型。

下圖是功能服務器加載功能插件的截圖:

ESFramework介紹之(8)-- 客戶端插件IPassiveAddin

下圖是客戶端加載客戶插件后的截圖:

ESFramework介紹之(8)-- 客戶端插件IPassiveAddin

下圖是客戶端插件提供服務的截圖:

ESFramework介紹之(8)-- 客戶端插件IPassiveAddin

經過上述的介紹,讀者應該對開發服務端的功能插件和客戶端插件有些了解了。快結束的時候,再為下篇blog開個頭。當我們開發了客戶端插件和服務端插件后,做調試是一項非常麻煩的工作,因為不僅要啟動應用服務器,還要啟動客戶端主程序、功能服務器才行。為了簡化這個過程,我實現了一個Bridge應用程序,只需要加載一pair插件(服務端插件和對應的客戶插件),即可進行兩個插件的調試,而不用在啟動客戶端、AS、FS了。

感謝關注!

上一篇: ESFramework介紹之(7)-- 服務器代理IServerAgent

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




ESFramework介紹之(8)-- 客戶端插件IPassiveAddin


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本人妖miran护士 | 日韩成人在线观看 | 久久97久久97精品免视看 | 成人激情免费视频 | 91久久亚洲国产成人精品性色 | 国产九九免费视频网站 | 91精品国产色综合久久 | www.在线播放 | 第一福利在线观看 | 日产国产精品久久久久久 | 日韩亚洲欧美视频 | 成人性视频免费网站 | 日韩专区中文字幕 | 特级毛片8级毛片免费观看 亚洲精品不卡 | 亚洲国产一区二区三区四区色欲 | 亚洲午夜网站 | 色综合天天色综合 | 日韩成人免费视频 | 色在线观看视频 | www.在线播放| 精品96久久久久久中文字幕无 | 国产精品视频第一页 | 亚洲性69影院在线观看 | 天堂中文在线最新版地址 | 午夜精品一区二区三区在线视频 | 日韩18在线观看地址 | 国产精品蜜臂在线观看 | 精品视频日本 | 国产成人高清视频免费播放 | 三级国产| 色网站在线视频 | 四虎影视国产884a精品亚洲 | 日本午夜精品一区二区三区电影 | 电视剧全部免费观看 | 精品中文字幕一区 | 精品av | 一级片视频免费观看 | 狠狠色婷婷丁香六月 | 国产激情在线观看 | 国产精品中文字幕在线观看 | 亚洲成人动漫在线观看 |