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


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

    页面接口的定义:

       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();
        }

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

     public abstract class PageBase : ContentControl, IPage
        {
            static PageBase()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(PageBase), new FrameworkPropertyMetadata(typeof(PageBase)));
            }
    
            public PageBase()
            {
                if (DesignerProperties.GetIsInDesignMode(this))
                    return;
                //焦点设置
                FocusManager.SetIsFocusScope(this, true);
                KeyboardNavigation.SetDirectionalNavigation(this, KeyboardNavigationMode.Contained);
                this.Focusable = false;
                //事件设置
                this.Loaded += new RoutedEventHandler(PageBase_Loaded);
                this.Unloaded += new RoutedEventHandler(PageBase_Unloaded);
            }
    
            void PageBase_Loaded(object sender, RoutedEventArgs e)
            {
                this.Loaded -= PageBase_Loaded;
                Initialize();
            }
    
            void PageBase_Unloaded(object sender, RoutedEventArgs e)
            {
                this.Unloaded -= PageBase_Unloaded;
            }
    
            #region IPage
    
            public string InstanceId { get; private set; }
    
            public bool IsPageServiceCreated { get; private set; }
    
            public ICoreClient CoreClient { get; private set; }
    
            /// <summary>
            /// 页面服务的名称
            /// </summary>
            protected virtual string PageServiceName
            {
                get
                {
                    return this.GetType().FullName;
                }
            }
    
            public void Initialize()
            {
                CoreClient = GL.Core.PartPlatform.Instance.GetSinglePart<ICoreClient>();
                if (!IsPageServiceCreated)
                {
                    this.InstanceId = this.CoreClient.CreatePageService("GL.Service.Page1.ServicePage1");
                    this.IsPageServiceCreated = true;
                }
            }
    
            public void Close()
            {
                this.CallService("Close", null);
            }
    
            public object CallService(string methodName, string[] paramTypes, params object[] args)
            {
                var request = new Request();
                request.InstanceId = this.InstanceId;
                request.MethodName = methodName;
                request.ParamTypes = paramTypes;
                request.Parameters = args.SerializeToByteArray();
                var result = this.CoreClient.CallService(request);
                return result.Value.DeserializeToObject();
            }
    
            public void OneWayCallService(string methodName, string[] paramTypes, params object[] args)
            {
                var request = new Request();
                request.InstanceId = this.InstanceId;
                request.MethodName = methodName;
                request.ParamTypes = paramTypes;
                request.Parameters = args.SerializeToByteArray();
                this.CoreClient.OneWayCallService(request);
            }
    
            public object CallPageService(string methodName, string[] paramTypes, params object[] args)
            {
                var request = new Request();
                request.InstanceId = this.InstanceId;
                request.MethodName = methodName;
                request.ParamTypes = paramTypes;
                request.Parameters = args.SerializeToByteArray();
                var result = this.CoreClient.CallPageService(request);
                return result.Value.DeserializeToObject();
            }
    
            public void OneWayCallPageService(string methodName, string[] paramTypes, params object[] args)
            {
                var request = new Request();
                request.InstanceId = this.InstanceId;
                request.MethodName = methodName;
                request.ParamTypes = paramTypes;
                request.Parameters = args.SerializeToByteArray();
                this.CoreClient.OneWayCallPageService(request);
            }
    
            #endregion
        }
    View Code

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

    页面服务基类的实现:

        public abstract class PageServiceBase : IPageService, IDisposable
        {
            public string InstanceId { get; private set; }
    
            public ISession Session { get; private set; }
    
    
            public PageServiceBase()
            {
                this.InstanceId = Guid.NewGuid().ToString();
            }
    
            /// <summary>
            /// 设置当前页面Session
            /// </summary>
            /// <param name="session"></param>
            public void SetSession(ISession session)
            {
                if (Session != null)
                {
                    throw new InvalidOperationException("page session has already setting!");
                }
                this.Session = session;
            }
    
            public void Initialize() 
            {
                this.OnInitializing();
                //TODO:初始化服务
    
                this.OnInitialized();
            }
    
            protected virtual void OnInitialized()
            {
    
            }
    
            protected virtual void OnInitializing()
            {
    
            }
    
            public virtual void Close() 
            {
                throw new NotImplementedException();
            }
    
    
            public object CallPage(string methodName, string[] paramTypes, params object[] args)
            {
                var request = new Request();
                request.InstanceId = this.InstanceId;
                request.MethodName = methodName;
                request.ParamTypes = paramTypes;
                request.Parameters = args == null ? null : args.SerializeToByteArray();
    
                return this.Session.CallbackService.PageCallback(request).Value.DeserializeToObject();
            }
    
    
            public T CallPage<T>(string methodName, string[] paramTypes, params object[] args)
            {
                return (T)this.CallPage(methodName, paramTypes, args);
            }
    
            public void OneWayCallPage(string methodName, string[] paramTypes, params object[] args)
            {
                var request = new Request();
                request.InstanceId = this.InstanceId;
                request.MethodName = methodName;
                request.ParamTypes = paramTypes;
                request.Parameters = args == null ? null : args.SerializeToByteArray();
    
                this.Session.CallbackService.OneWayPageCallback(request);
            }
    
            public void Dispose()
            {
                throw new NotImplementedException();
            }
        }
    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!享受我们的成果吧!

    本文来自博客园,作者:广林,转载请注明原文链接:https://www.cnblogs.com/guanglin/p/3139325.html

  • 相关阅读:
    获得SQL语句的模板,自己写类似readtrace时候用
    我的HD2手机
    匹配symbols
    再送一次书
    微软急聘MOSS高手!
    邮件规则的实现
    System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?
    windbg中无法加载mscorwks.dll, Win32 error 0n2
    Diablo3狗熊榜
    软件构架师的特点
  • 原文地址:https://www.cnblogs.com/guanglin/p/3139325.html
Copyright © 2020-2023  润新知