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