页面与页面服务的创建

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

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

页面接口的定义:

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

 
 
分类: 书籍分享
原文地址:https://www.cnblogs.com/Leo_wl/p/3142779.html