zoukankan      html  css  js  c++  java
  • 页面与页面服务的创建

    一步步实现自己的框架系列(四):页面与页面服务的创建

     上一篇已经把我们的基础通信做好了,接下来就开始创建页面与页面服务,首先来看下我们页面与页面服务的接口定义,一目清晰了然。

    页面接口的定义:

    复制代码
       public interface IPage
        {
            string InstanceId { get; }
    
            bool IsPageServiceCreated { get; }
    
            ICoreClient CoreClient { get; }
    
            /// <summary>
            /// 初始化页面
            /// </summary>
            void Initialize();
    
            /// <summary>
            /// 关闭页面
            /// </summary>
            void Close();
    
    
            /// <summary>
            /// 调用服务方法
            /// </summary>
            /// <param name="methodName">方法名称</param>
            /// <param name="paramTypes">方法参数类型的类名列表</param>
            /// <param name="args">方法参数集合</param>
            /// <returns>返回结果</returns>
            object CallService(string methodName, string[] paramTypes, params object[] args);
    
            /// <summary>
            /// 单向调用服务方法(通信成功即返回,不等待方法执行)
            /// </summary>
            /// <param name="methodName">方法名称</param>
            /// <param name="paramTypes">方法参数类型的类名列表</param>
            /// <param name="args">方法参数集合</param>
            void OneWayCallService(string methodName, string[] paramTypes, params object[] args);
    
    
    
            /// <summary>
            /// 调用页面服务
            /// </summary>
            object CallPageService(string methodName, string[] paramTypes, params object[] args);
    
            /// <summary>
            /// 单向调用页面服务
            /// </summary>
            void OneWayCallPageService(string methodName, string[] paramTypes, params object[] args);
    
        }
    复制代码

    页面服务接口的定义:

    复制代码
        public interface IPageService
        {
            /// <summary>
            /// 页面实例ID
            /// </summary>
            string InstanceId { get; }
    
            ISession Session { get; }
    
            void SetSession(ISession session);
    
            /// <summary>
            /// 初始化页面服务
            /// </summary>
            void Initialize();
    
            /// <summary>
            /// 关闭页面服务
            /// </summary>
            void Close();
    
    
            /// <summary>
            /// 回调页面客户端方法
            /// </summary>
            /// <param name="methodName">方法名称</param>
            /// <param name="paramTypes">方法参数类型的类名列表</param>
            /// <param name="args">方法参数集合</param>
            /// <returns>客户端方法返回结果</returns>
            object CallPage(string methodName, string[] paramTypes, params object[] args);
    
            /// <summary>
            /// 单向回调页面客户端方法(通信成功即返回,不等待方法执行)
            /// </summary>
            /// <param name="methodName">方法名称</param>
            /// <param name="paramTypes">方法参数类型的类名列表</param>
            /// <param name="args">方法参数集合</param>
            void OneWayCallPage(string methodName, string[] paramTypes, params object[] args);
    
            /// <summary>
            /// 销毁页面服务
            /// </summary>
            void Dispose();
        }
    复制代码

    接下来就是页面基类的实现:

     View Code

      页面基类实现了页面与服务通信与函数调用的基本功能。

    页面服务基类的实现:

     View Code

    下面就做个单元测试,测试下我们的成果吧。

    测试页面定义:

    复制代码
        public class Page1 : PageBase
        {
            public void WriteLine(string msg)
            {
                Console.WriteLine(msg);
            }
        }
    复制代码

    测试页面服务定义:

    复制代码
        public class ServicePage1 : PageServiceBase
        {
    
            public void InvokeClientConsole()
            {
                this.OneWayCallPage("WriteLine", null, "Hello World!");
            }
        }
    复制代码


    启动服务端:

    复制代码
        class Program
        {
            static void Main(string[] args)
            {
                XmlConfigurator.Configure();
    
                Program p = new Program();
    
                string path = Path.Combine(Environment.CurrentDirectory, "GL.Service.Test.config");
    
                var partPath = @"C:GLGL.DynamicDLLLoadTestGL.ReleaseServiceTest";
                //启动插件平台
                PartPlatform.Instance.Start(path, new string[] { partPath });
    
                Console.WriteLine("PartPlatform Started");
                //启动核心服务
                Program.StartService("GL WCF Service", typeof(CoreService));
    
                Console.WriteLine("CoreServiceHost Started");
    
                Console.ReadKey();
            }
    
            private static IList<ServiceHost> _startedServices = new List<ServiceHost>();
    
            private static void StartService(string serviceName, Type serviceType)
            {
                var service = new ServiceHost(serviceType);
                service.Open();
                _startedServices.Add(service);
    
            }
        }
    复制代码

    启动客户端:

    复制代码
     class Program 
        {
            [STAThreadAttribute]
            static void Main(string[] args)
            {
                XmlConfigurator.Configure();
    
                Program p = new Program();
                string path = Path.Combine(Environment.CurrentDirectory, "GL.Service.Test.config");
    
                var partPath = @"C:GLGL.DynamicDLLLoadTestGL.ReleaseClientTest";
                //启动插件平台
                PartPlatform.Instance.Start(path, new string[] { partPath });
    
                //连接到服务端
                var coreClient = PartPlatform.Instance.GetSinglePart<ICoreClient>();
    
                var sessionID = coreClient.Connect(new GL.Contracts.ClientConnectionInfo() { UserName="GL", UserPassword = "GL" });
    
                Console.WriteLine("sessionID:{0}", sessionID);
    
                while (Console.ReadKey().KeyChar == (char)Keys.Enter)
                {
                    //创建页面
                    var pg = PageFactory.CreatePage("GL.Client.Page1.Page1");
    
                    Console.WriteLine("OneWayCallService" + pg.InstanceId);
    
                    //调用页面服务
                    var request = new Request();
                    request.InstanceId = pg.InstanceId;
                    request.MethodName = "InvokeClientConsole";
                    request.ParamTypes = null;
                    request.Parameters = null;
    
                    coreClient.OneWayCallPageService(request);
                }
                Console.ReadLine();
            }
        }
    复制代码

    最激动人心的时刻,永远是屏幕出现那令人期待的Hello World!享受我们的成果吧!

     
     
    分类: C#

       文章目录:

    1. 引言
    2. 书籍首页
    3. 书籍目录
    4. 备注
    5. 下载

    引言:

       平时没有项目压力时候,首先想到的是充电学习,要系统学习都会想到购买书籍,或者向同事借阅。买的书多了烦恼也来了,因为大学到现在5-6年陆续买了上百本开发书籍,面对堆积如山的书,每每搬家,排队,等公车都无法做到便捷。于是想到把这些纸质的书全部转行为电子书,刚好上次一位好友索要,于是第一次动手自己做了一个PDF电子书,这样每次用Galaxy Note2或Ipad看书,真是太爽了,实在是居家旅行 杀人灭口 必备良药!分享如下:

    书籍首页

       

    书籍目录

      

      

    备注:

       由于博客园目前文件大小不支持超过10M,所以这边不能提供下载链接。

          

       制作电子书,要扫描每一页为图片,然后再次用PDF进行编辑,制作完一本书真感觉有点自虐,但想到园子里有千千万万这样的学子,所谓我不入地狱谁入地狱。本人制作方式比较老土,如果您有好的快速的制作方法,希望您能提出宝贵意见

      后期会陆续提供其他类型开发电子书,敬请期待。

      

    下载方式:

       谢谢网友rabow(183717506)的建议,现已统一把连接上传到QQ群,后续书籍的制作上传,统一放在群(群号:288145526)里,敬请期待。当然,你要采用下面的三种方式向我索要,当然也可以。

       目前索要的人比较,给您带来的不便,请理解。

          (1)如果是加Q请你主动联系我,我好做记录并一一回复;

          (2)如果您是留电子邮箱,一段时间内我会统一发送,还得请您耐心等会儿。中间如果有遗漏或者你想马上要,请直接Q我。

          (3)如果您也有115网盘,直接点击http://115.com/?ct=rar&pickcode=e4bcc8qi下载

      

       

      如果你需要用别的方式下载,可以联系我QQ。

     
     
    分类: 书籍分享
  • 相关阅读:
    关于发现宇宙微波背景(CMB)辐射的一则趣闻
    windows 8,关闭随意窗体都提示“已停止工作”的解决的方法
    非洲小孩
    Android自己定义控件背景及其Drawable以实现扁平化
    POJ2533:Longest Ordered Subsequence
    iOS Dev (63) 怎样在 TableView 滚动时收起键盘?
    自己用c语言做的日历
    time .h 的用法
    动态规划--目标和问题
    Linux shell编程学习笔记---第八章
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3142779.html
Copyright © 2011-2022 走看看