Flex與.NET互操作(八) 使用FluorineFx網(wǎng)關(guān)實(shí)現(xiàn)遠(yuǎn)程訪問(wèn)
FluorineFx提供的遠(yuǎn)程訪問(wèn)包括有很多方面的知道點(diǎn),本文只介紹其中的三個(gè)知識(shí)點(diǎn):訪問(wèn)遠(yuǎn)程對(duì)象返回對(duì)象,返回DataTable,返回DataSet對(duì)象.FluorineFx安裝包里自帶有相關(guān)的示例程序,要學(xué)習(xí)更多可直接參考這些示例程序.
在實(shí)現(xiàn)訪問(wèn)前我們同樣來(lái)做一些準(zhǔn)備工作,建立好遠(yuǎn)程對(duì)象,如下:
2 {
3 public class Book
4 {
5 public int Id { get; set; }
6 public string Name { get; set; }
7 public string Author { get; set; }
8 public double Price { get; set; }
9 }
10 }
下面是提供Flex訪問(wèn)的遠(yuǎn)程對(duì)象:


1 namespace Fluorine.ServiceLibrary
2 {
3 [RemotingService]
4 public class FluorineService
5 {
6 /// <summary>
7 /// 返回一個(gè)簡(jiǎn)單對(duì)象
8 /// </summary>
9 /// <returns></returns>
10 public Book GetBook()
11 {
12 return new Book
13 {
14 Id = 1,
15 Name = "《三國(guó)演義》",
16 Author = "羅貫中",
17 Price = 100
18 };
19 }
20
21 /// <summary>
22 /// 返回DataTable對(duì)象
23 /// </summary>
24 /// <returns></returns>
25 [DataTableType("Fluorine.ServiceLibrary.Book")]
26 public DataTable GetDataTable()
27 {
28 DataTable dt = new DataTable("Book");
29 dt.Columns.Add("Id", typeof(int));
30 dt.Columns.Add("Name", typeof(string));
31 dt.Columns.Add("Author", typeof(string));
32 dt.Columns.Add("Price", typeof(double));
33
34 DataRow dr = dt.NewRow();
35 dr["Id"] = 1;
36 dr["Name"] = "《三國(guó)演義》";
37 dr["Author"] = "羅貫中";
38 dr["Price"] = 52.30;
39 dt.Rows.Add(dr);
40
41 dr = dt.NewRow();
42 dr["Id"] = 2;
43 dr["Name"] = "《西游記》";
44 dr["Author"] = "吳承恩";
45 dr["Price"] = 39.91;
46 dt.Rows.Add(dr);
47
48 return dt;
49 }
50
51 /// <summary>
52 /// 返回DataSet對(duì)象
53 /// </summary>
54 /// <returns></returns>
55 [DataSetType("Fluorine.ServiceLibrary.Book")]
56 public DataSet GetDataSet()
57 {
58 DataSet ds = new DataSet("DS");
59 DataTable dt = ds.Tables.Add("Books");
60 dt.Columns.Add("Id", typeof(int));
61 dt.Columns.Add("Name", typeof(string));
62 dt.Columns.Add("Author", typeof(string));
63 dt.Columns.Add("Price", typeof(double));
64
65 DataRow dr = dt.NewRow();
66 dr["Id"] = 1;
67 dr["Name"] = "《三國(guó)演義》";
68 dr["Author"] = "羅貫中";
69 dr["Price"] = 52.30;
70 dt.Rows.Add(dr);
71
72 dr = dt.NewRow();
73 dr["Id"] = 2;
74 dr["Name"] = "《西游記》";
75 dr["Author"] = "吳承恩";
76 dr["Price"] = 39.91;
77 dt.Rows.Add(dr);
78
79 return ds;
80 }
81
82 }
83 }
上面代碼片段中分別提供了返回一個(gè)對(duì)象,DataTable,DataSet對(duì)象的方法。這里只需要記住兩個(gè)關(guān)鍵標(biāo)識(shí)就行,它門(mén)是:DataTableType和DataSetType. 下面通過(guò)Flex的非可視化組件<mx:RemoteObject>來(lái)訪問(wèn)遠(yuǎn)程對(duì)象,OK,下面我們來(lái)看看具體怎么來(lái)調(diào)用。
2 source="Fluorine.ServiceLibrary.FluorineService"
3 fault="onFaultHandler(event)"
4 <mx:method name="GetBook" result="onGetBookHandler(event)"/>
5 <mx:method name="GetDataTable" result="onGetDataTableHandler(event)"/>
6 <mx:method name="GetDataSet" result="onGetDataSetHandler(event)"/>
7 </mx:RemoteObject>
一、返回對(duì)象示例
2 private var book:BookVO;
3
4 private function onGetBookHandler(evt:ResultEvent):void
5 {
6 book=evt.result as BookVO;
7 }
通過(guò)點(diǎn)擊按扭調(diào)用遠(yuǎn)程方法GetBook()完成方法的調(diào)用,直接可以將返回結(jié)果綁定到界面元素上。
2 <mx:TextInput width="302" text="{boo.Name+book.Author+book.Price}"/>
二、返回DataTable對(duì)象
返回DataTable和DataSet,將結(jié)果綁定到DataGrid上顯示,先看看DataGrid的定義:
2 <mx:columns>
3 <mx:DataGridColumn headerText="編號(hào)" dataField="Id"/>
4 <mx:DataGridColumn headerText="書(shū)名" dataField="Name"/>
5 <mx:DataGridColumn headerText="作者" dataField="Author"/>
6 <mx:DataGridColumn headerText="價(jià)格" dataField="Price"/>
7 </mx:columns>
8 </mx:DataGrid>
DataGrid的數(shù)據(jù)源為定義的一個(gè)ArrayCollection對(duì)象,詳細(xì)如下:
2 private var books:ArrayCollection;
2 {
3 books=evt.result as ArrayCollection;
4 }
三、返回DataTable對(duì)象
2 {
3 books=evt.result as ArrayCollection;
4 }
如上便完成了通過(guò)FluorineFx網(wǎng)關(guān)來(lái)實(shí)現(xiàn)遠(yuǎn)程訪問(wèn),下面是完整的Flex端代碼,實(shí)現(xiàn)很簡(jiǎn)單這里就不作詳細(xì)講解:
2 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
3 <mx:Script>
4 <![CDATA[
5 import mx.controls.Alert;
6 import mx.rpc.events.ResultEvent;
7 import mx.rpc.events.FaultEvent;
8 import mx.collections.ArrayCollection;
9 [Binable]
10 private var books:ArrayCollection;
11 [Binable]
12 private var book:BookVO;
13
14 private function onGetBookHandler(evt:ResultEvent):void
15 {
16 book=evt.result as BookVO;
17 }
18
19 private function onGetDataTableHandler(evt:ResultEvent):void
20 {
21 books=evt.result as ArrayCollection;
22 }
23
24 private function onGetDataSetHandler(evt:ResultEvent):void
25 {
26 books=evt.result as ArrayCollection;
27 }
28
29 private function onFaultHandler(evt:FaultEvent):void
30 {
31 Alert.show(evt.fault.faultDetail);
32 }
33 ]]>
34 </mx:Script>
35 <mx:Panel x="42" y="56" width="578" height="226" layout="absolute" fontSize="12">
36 <mx:DataGrid x="10" y="10" width="543" height="147" dataProvider="{books}">
37 <mx:columns>
38 <mx:DataGridColumn headerText="編號(hào)" dataField="Id"/>
39 <mx:DataGridColumn headerText="書(shū)名" dataField="Name"/>
40 <mx:DataGridColumn headerText="作者" dataField="Author"/>
41 <mx:DataGridColumn headerText="價(jià)格" dataField="Price"/>
42 </mx:columns>
43 </mx:DataGrid>
44 <mx:ControlBar>
45 <mx:Button label="DataTable" click="getDataTable()"/>
46 <mx:Button label="DataSet" click="getDataSet()"/>
47 <mx:Button label="Book" click="ro.GetBook()"/>
48 <mx:TextInput width="302" text="{boo.Name+book.Author+book.Price}"/>
49 </mx:ControlBar>
50 </mx:Panel>
51 <mx:RemoteObject id="ro" destination="fluorine" >
52 source="Fluorine.ServiceLibrary.FluorineService"
53 fault="onFaultHandler(event)"
54 <mx:method name="GetBook" result="onGetBookHandler(event)"/>
55 <mx:method name="GetDataTable" result="onGetDataTableHandler(event)"/>
56 <mx:method name="GetDataSet" result="onGetDataSetHandler(event)"/>
57 </mx:RemoteObject>
58 </mx:Application>
20 {
21 books=evt.result as ArrayCollection;
22 }
23
24 private function onGetDataSetHandler(evt:ResultEvent):void
25 {
26 books=evt.result as ArrayCollection;
27 }
28
29 private function onFaultHandler(evt:FaultEvent):void
30 {
31 Alert.show(evt.fault.faultDetail);
32 }
33 ]]>
34 </mx:Script>
35 <mx:Panel x="42" y="56" width="578" height="226" layout="absolute" fontSize="12">
36 <mx:DataGrid x="10" y="10" width="543" height="147" dataProvider="{books}">
37 <mx:columns>
38 <mx:DataGridColumn headerText="編號(hào)" dataField="Id"/>
39 <mx:DataGridColumn headerText="書(shū)名" dataField="Name"/>
40 <mx:DataGridColumn headerText="作者" dataField="Author"/>
41 <mx:DataGridColumn headerText="價(jià)格" dataField="Price"/>
42 </mx:columns>
43 </mx:DataGrid>
44 <mx:ControlBar>
45 <mx:Button label="DataTable" click="getDataTable()"/>
46 <mx:Button label="DataSet" click="getDataSet()"/>
47 <mx:Button label="Book" click="ro.GetBook()"/>
48 <mx:TextInput width="302" text="{boo.Name+book.Author+book.Price}"/>
49 </mx:ControlBar>
50 </mx:Panel>
51 <mx:RemoteObject id="ro" destination="fluorine" >
52 source="Fluorine.ServiceLibrary.FluorineService"
53 fault="onFaultHandler(event)"
54 <mx:method name="GetBook" result="onGetBookHandler(event)"/>
55 <mx:method name="GetDataTable" result="onGetDataTableHandler(event)"/>
56 <mx:method name="GetDataSet" result="onGetDataSetHandler(event)"/>
57 </mx:RemoteObject>
58 </mx:Application>