• 页面与页面服务的创建


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

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

    页面接口的定义:

    复制代码
       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。

     
     
    分类: 书籍分享
  • 相关阅读:
    C#面向对象设计模式纵横谈 笔记10 Decorator 装饰(结构型模式)
    [译]WPF 应用程序和MVVM设计模式 ——Josh Smith
    熙熙如何对待JavaScript(绝好的一套针对初学者的JavaScript教程)推荐教程下载PDFCHM电子书经熙熙筛选整理
    熙熙如何在Vmware里安装Ubantu9.10Alpha6(虚拟机安装Linux)
    熙熙如何设置WinCE仿真模拟器(网络、串口、耳机)
    熙熙我的博客开通啦
    熙熙SQLCE类熙熙
    熙熙WebBrowser判断登录成功WebBrowser404错误500错误屏蔽消息窗口Webbrowser判断是否加载成功
    熙熙如何用USB将WinCE与PC同步(天嵌开发板,ARM)
    推荐我一个很喜欢的音乐软件 多米音乐盒
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3142779.html
Copyright © 2020-2023  润新知