- 浏览: 79451 次
文章分类
- 全部博客 (136)
- 我的技术资料收集 (98)
- 具体技术 (1)
- 的技术资料收集 (4)
- All Articles (1)
- 机器学习 Machine Learning (1)
- 网络编程 (1)
- java (2)
- ava (1)
- 零散技术 (1)
- C# (3)
- 技术资料收集 (1)
- CQRS (1)
- 数据库技术(MS SQL) (1)
- .Net微观世界 (1)
- Oracle SQL学习之路 (1)
- C/C++ (1)
- JS/JQ (1)
- Js封装的插件/实例/方法 (2)
- 敏捷个人 (2)
- Javascript (1)
- 程序设计---设计模式 (1)
- Bug (1)
- 未知分类 (1)
- 程序设计 (1)
- Sharepoint (1)
- Computer Graphic (1)
- IT产品 (1)
- [06]JS/jQuery (1)
- [07]Web开发 (1)
- .NET Solution (1)
- Android (3)
- 机器学习 (1)
- 系统框架设计 (1)
- Others (1)
- 算法 (1)
- 基于Oracle Logminer数据同步 (1)
- 网页设计 (1)
- 原创翻译 (1)
- EXTJS (1)
- Jqgrid (1)
- 云计算 (1)
最新评论
原帖地址:http://www.cnblogs.com/guanglin/p/3139325.html
上一篇已经把我们的基础通信做好了,接下来就开始创建页面与页面服务,首先来看下我们页面与页面服务的接口定义,一目清晰了然。
页面接口的定义:
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
}
页面基类实现了页面与服务通信与函数调用的基本功能。
页面服务基类的实现:
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();
}
}
下面就做个单元测试,测试下我们的成果吧。
测试页面定义:
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:\GL\GL.DynamicDLLLoadTest\GL.Release\ServiceTest";
//启动插件平台
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:\GL\GL.DynamicDLLLoadTest\GL.Release\ClientTest";
//启动插件平台
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!享受我们的成果吧!
相关推荐
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的...
Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的...
教程 通过手把手地方式教你一步步的创建一个 Web 应用。如果你初学 Django 或编程,请从这里开始。也请看看下面的 "快速入门"。 专题指南 在相当高的层次上介绍关键主题和概念,并提供有用的背景信息和解释。 参考...
Struts in Action 一步步介绍了Struts 框架。 并且书中好包含展示此书介绍的最好实践技术的几个示例应用程序。本书旨在帮助那些需要关于如何使他们的应用运行在Struts下面的实际和实战技术的专业技术人员。 ...
工具选好了,下面就需要按照规划一步步地把自己的想法变成现实了,是一个复杂而细致的过程,一定要按照先大后小、先简单后复杂来进行制作。在制作网页时,先把大的结构设计好,然后再逐步完善小的结构设计。先设计出...
先说下实现原理,再一步步分析 这里总共有2个Activity一个就是主页,一个就是显示我们图片效果的页面,参数通过Intent传送,素材内容均来自网络,(感谢聪明的蘑菇) 图片都是Glide异步下的,下的,下的重要的事情说三...
本书教你一步步的学习基础,包括变量,函数,操作符,事件处理,对象,数组,字符串,窗体,框架.你也可以学习更高级的技术,包括调试和安全.本指南解释了JavaScript是如何与XHTML Transitional 一起工作的,覆盖JavaScript中新...
因此,虽然前期部署的步骤较多,但已经为大家自动化处理了很大部分的流程,只需要跟着下面的命令一步步执行,一般是不会有部署问题的。 1、为你的计算机安装 PHP 环境,参考、PHP官方 。 2、为你的计算机安装 ...