zoukankan      html  css  js  c++  java
  • Flex和.net Webservice之间多层结构开发

    Flex2和.net Webservice之间多层结构开发小经验

    今天在网上看到有人在问关于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


    噢耶游戏是中国最大的轻社交游戏开发商,致力于手机页游的研发及推广业务。我们首创性地提出了HTML5游戏中心思路,在第三方App 中嵌入式休闲游戏,为开发者提供了全新的应用内游戏解决方案。
  • 相关阅读:
    Javaoop_继承
    事务,视图,索引,备份和恢复
    常用函数。
    为虚拟机配置NAT网络
    安装Linux系统
    初始Redis
    高内聚低耦合
    MyBatis动态SQL
    初始MyBatis
    GitHub的操作
  • 原文地址:https://www.cnblogs.com/yintian2/p/1029631.html
Copyright © 2011-2022 走看看