惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
V
V2EX
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
小众软件
小众软件
Vercel News
Vercel News
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
J
Java Code Geeks
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog
B
Blog
美团技术团队
量子位

博客园 - 噢耶游戏

星际迷航 致、青春 12306火车票网站自动登录工具 Compile your AS3 projects with Ant + Flex SDK (all Open Source) 有史以来关于Flash Player的最详细说明 深入理解Flash Player的应用程序域(Application Domains)(转载) 弄了个新blogs 欢迎捧场 PHP 实用便捷代码(转) 一个鼠标拖出一个圆形的简单demo Flex中不使用FelxPrintJob通过ExternalInterface直接调用JavaScript利用浏览器本身的功能进行打印 HttpModule 工作原理(转) Flex 拖拽 - 噢耶游戏 - 博客园 ASP.NET防止盗链(转) CS0016: 未能写入输出文件“C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\webapp\2adfa36a\1a90a869\8_prkz0n.dll" 错误的解决办法。 - 噢耶游戏 FLEX 12个基础 很有用的方法 取得工作目录下的文件 Asp.net中防止用户多次登录的方法(转) 大型网站的系统架构(摘) ActionSrcipt 资源 - 噢耶游戏 - 博客园
Flex和.net Webservice之间多层结构开发
噢耶游戏 · 2008-01-07 · via 博客园 - 噢耶游戏

今天在网上看到有人在问关于C#编写BLL层的一些问题,所以想到一个多月前做的一个小测试,今天把它整理一下,说一下思路,发出来大家交流一下.

首先,开头先讲一下多层结构,具体内容我就不会花太多篇幅,因为这方面的经验,我想搞.net BS的人比我更清楚.我只是提一下.Flex在多层结构中的一些优势.

Okay废话就不说了,


在图中我们可以看到,C#的表现层,我们用Webservice替代,而C#的Model我们在Flex里建立一个镜像的Model.这样的一个最大的优点就是,我们在数据传输的时候,通过格式化后的model,两边都有一个实体与之对应,操作起来十分方便.例如,我们先看一下C#中的Web方法的写法:

----------------------------------------
----------------------------------------


           

/// <summary>


           

/// C# To Flex Model


           

/// </summary>


           

/// <returns>Model</returns>


           

[WebMethod]


           

public RedPill.Model.UserInfo Ws2Flex()


           

{}


           

这样我们的返回值可以设置成我们的Model.而不用过去的方法:返回一个XMLDocument的类型.Webservice会按我们的定义返回一个序列化的XML.

我们再看一下C#的Model的结构:



           

using System;


           

using System.Data;


           

using System.Configuration;


           

using System.Web;


           

using System.Web.Security;


           

using System.Web.UI;


           

using System.Web.UI.WebControls;


           

using System.Web.UI.WebControls.WebParts;


           

using System.Web.UI.HtmlControls;


           
           

namespace RedPill.Model


           

{


           

/// <summary>


           

/// User Info Model.


           

/// </summary>


           

public class UserInfo


           

{


           

public UserInfo()


           

{


           

}


           
           

private Int32 m_ID;


           

private Boolean m_IsForPublic;    //是否公开


           

private String m_UserName;    //用户姓名


           

private String m_UserPassword;    //用户密码


           

private String m_UserTrueName;    //真实姓名


           

public Int32 ID


           

{


           

get { return m_ID; }


           

set { m_ID = value; }


           

}


           

///<summary>


           

///是否公开


           

///</summary>


           

public Boolean IsForPublic


           

{


           

get { return m_IsForPublic; }


           

set { m_IsForPublic = value; }


           

}


           

///<summary>


           

///用户姓名


           

///</summary>


           

public String UserName


           

{


           

get { return m_UserName; }


           

set { m_UserName = value; }


           

}


           

///<summary>


           

///用户密码


           

///</summary>


           

public String UserPassword


           

{


           

get { return m_UserPassword; }


           

set { m_UserPassword = value; }


           

}


           

///<summary>


           

///真实姓名


           

///</summary>


           

public String UserTrueName


           

{


           

get { return m_UserTrueName; }


           

set { m_UserTrueName = value; }


           

}


           

}


           

}


           

很容易看懂,全是Get Set. 因为本身Model只是信息的承载体,因此里面不放任何逻辑处理.这样相当于是什么呢?就相当于,我们每个人传递的东西都是一个被打了包的东西,我们不一个一个的传递包内的内容,我们只关心这个包的本身的传递.

回到我们C#的方法里来:



           

/// <summary>


           

/// C# To Flex Model


           

/// </summary>


           

/// <returns>Model</returns>


           

[WebMethod]


           

public RedPill.Model.UserInfo Ws2Flex()


           

{


           

UserInfo rt = new UserInfo();


           

rt.ID = 0;


           

rt.IsForPublic = true;


           

rt.UserName = "http://ezse.com";


           

rt.UserPassword = "How 2 Use Model In Flex";


           

rt.UserTrueName = "Shawn";


           

return rt;


           

}


           

/// <summary>


           

/// Flex Model To C#


           

/// </summary>


           

/// <param name="rt">Model</param>


           

[WebMethod]


           

public void Flex2Ws(UserInfo rt)


           

{


           

Debug.WriteLine("ID:" + rt.ID.ToString());


           

Debug.WriteLine("Is for public?:" + rt.IsForPublic.ToString());


           

Debug.WriteLine("User Name:" + rt.UserName);


           

Debug.WriteLine("WD:" + rt.UserPassword);


           

Debug.WriteLine("True Name:" + rt.UserTrueName);


           
           

}


           

两个方法分别功能是向Flex返回一个model,另一个是把Flex给C#的model输出出来.很简单的功能.

然后我们再看一下invoke Webservice返回的数据形态:



           

<UserInfo>


           

<ID>0</ID>


           

<IsForPublic>true</IsForPublic>


           

<UserName>http://ezse.com</UserName>


           

<UserPassword>How 2 Use Model In Flex</UserPassword>


           

<UserTrueName>Shawn</UserTrueName>


           

</UserInfo>


           

在Flex中,我们建立两个三个类,一个是ServiceLocator,它标明我们的服务地址.向程序提供服务.

二是TokenResponder 它是实现IResponder接口的,它功能是把所有的错误信息都统一输出.

三是我们的Model映像. UserInfo.前两个类,请看最后的源程序,我就不用多说了,我只是把关键的Model和主程序放出来说明:

好,现在我们看一下UserInfo.as的内容:



           

////////////////////////////////////////////////////////////////////////////////


           

//


           

// Copyright (C) 2005-2006 RedPill.


           

// Name: Flex web service Model Transf.


           

// Ver: -


           

// Author:YX.Shawn


           

// Create:Thu Nov 30 21:24:50 GMT+0800 2006


           

// Modify:


           

// Function:


           

// ***


           

//        this is a demo for let everyone know how to transfer model between C# & Flex.


           

//        And this demo is esp for 5 Layer design.


           

//            (DF-> DAL ->BLL->resentation)


           

//             |->Model->|


           

//        For much infomation ,pls leave ur suggestion to my blog: http://blog.ezse.com


           

//        Or mail me: yx.shawn@gmail.com


           

//


           

//                Enjoy.


           

// ***


           

//


           

////////////////////////////////////////////////////////////////////////////////


           

package Model


           

{


           

    /**


           

     * Here, you can modify something you need by datasouse.


           

     * This way is esp for data type conversion.


           

     * such as Date


           

     * e.g.:


           

     *         var dfateFormatter = new DateFormatter();


           

     *        this[i] = new Date(Date.parse(df.format(source[i])));


           

     */


           

    public class UserInfo


           

    {


           

        public function UserInfo(source:Object=null)


           

        {


           

            super();


           

            if(source!=null)


           

            {


           

                for (var i:String in source)


           

         {


           

             try


           

             {


           

                 if (i == "UserTrueName" && source[i] is String)


           

                     this[i] = source[i]+"_MDF";


           

                 else


           

                     this[i] = source[i];


           

             }


           

             catch(e:Error)


           

             {


           

                 //ignore


           

             }


           
           

         }


           

            }


           

        }


           
           

        /**


           

         * define each vars use the same name as C# model


           

         * to make sure web service can translate model


           

         */


           

        public var ID:Number;


           

        public var IsForPublic:Boolean;


           

        public var UserName:String;


           

        public var UserPassword:String;


           

        public var UserTrueName:String;


           

    }


           

}


           

可以很容易的看出和C#的model一样的是,里面采用的变量及变量的类型是一致的.所以称之为C#里Model的镜像.

然后FLEX如何去和C#通信呢?这个最基础的内容,WebService的



           

import mx.rpc.AbstractService;


           

import Model.UserInfo;


           

import mx.rpc.AsyncToken;


           

import RPC.*;


           

private var service:AbstractService;


           

//Security.allowDomain("*");


           

private function init():void


           

{


           

    service = RPC.ServiceLocator.getUserInfoService();


           

    var token:AsyncToken = AsyncToken(service.Ws2Flex());


           

    token.addResponder(new TokenResponder(onWsRespond,"Error Get Data"));


           

}


           

private function onWsRespond(md:Object):void


           

{


           

    var us:UserInfo = new UserInfo(md.result);


           

    trace("ID"+us.ID);


           

    trace("IsForPublic"+us.IsForPublic);


           

    trace("UserName"+us.UserName);


           

    trace("UserPassword"+us.UserPassword);


           

    trace("UserTrueName"+us.UserTrueName);


           

    trace("==============================");


           

    trace("Change userTrueName to YX.Shawn. and call web service back...");


           

    us.UserTrueName = "YX.Shawn";


           

    var token:AsyncToken = AsyncToken(service.Flex2Ws(us));


           

}


           

在init的方法里,我们通过异步调用,去调用我们在C#里写的Webservice的方法.在返回的监听方法里,我们通过图中高亮的那句话var us:UserInfo = new UserInfo(md.result);把返回的Model和Flex的Model进行对应.然后再修改参数后,回传到C#中.我们来看一下输出:



           

Flex输出
           


           

ID0


           

IsForPublictrue 
           

UserNamehttp://ezse.com


           

UserPasswordHow 2 Use Model In Flex


           

UserTrueNameShawn_MDF


           

==============================


           

Change userTrueName to YX.Shawn. and call web service back...


           

           

C#输出


           

           

ID:0


           

Is for public?:True


           

User Name:http://ezse.com


           

PWD:How 2 Use Model In Flex True Name:YX.Shaw


观察输出会发现,在Flex里的输出里,TrueName多了_MDF,原因是我们在Model里做了一些调整,这个可以用于例如时间的类型转换呀一类的.回传的TrueName也变成了YX.Shawn.因此所有功能都实现.

可见,两边互传数据显得十分的简单.在C#也可以把Flex的model直接充当参数传递.

下面我就放上程序以及数据传递框架图


源程序下载地址:http://res.ezse.com/Howto/HowTo-Model.rar