`

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

    博客分类:
  • C#
阅读更多
原帖地址: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!享受我们的成果吧!



 

本文链接

分享到:
评论

相关推荐

    MVC原生框架一步步搭建

    下面我们将详细探讨如何一步步搭建基于PHP的MVC原生框架。 1. **理解MVC模式** - Model:模型层,负责处理业务逻辑和数据操作,通常与数据库交互。 - View:视图层,展示给用户看到的页面内容。 - Controller:...

    第一章:创建一个SpringBoot项目,并访问页面出现Hello Wold

    在本章中,我们将深入探讨如何创建一个基本的Spring Boot项目并实现一个简单的"Hello World"页面。Spring Boot是Java开发中的一个热门框架,它简化了Spring应用的配置和启动过程,使得开发者能够快速地搭建应用程序...

    使用客户端框架创建“纯粹”的Ajax应用程序

    描述中的“视频手把手教程”意味着我们将深入到实际操作中,学习如何利用特定的客户端框架来一步步构建这样的应用程序。这种教学方式通常包括讲解、演示以及实践指导,确保学习者能够理解和掌握相关技能。 【标签】...

    SSH2框架搭建详细图解

    本详细图解将带你一步步了解如何搭建SSH2框架,并实现一个简单的注册功能。 首先,让我们从Struts2开始。Struts2是一个基于MVC(Model-View-Controller)设计模式的开源Web应用框架,它继承了Struts1的优点,同时...

    ssi框架简单搭建。。。

    对于初学者,以下是一步步搭建SSI框架的步骤: 1. **环境准备**:确保已安装并配置好Java Development Kit (JDK) 和Java Web服务器,如Tomcat。 2. **创建项目结构**:建立一个标准的Web应用目录结构,包括WEB-INF...

    maven2+struts2+spring3使用maven一步步搭建ssissh框架.pdf

    这篇文档介绍的是如何使用Maven2、Struts2版本2.1.8.1和Spring3.0.0.RELEASE来搭建一个名为SSISSH的框架。以下是对这个过程的详细解释: 1. **Maven**:Maven是一个项目管理工具,它可以帮助开发者管理项目的构建、...

    浮木云学习日志(3)-搭建静态页面

    该文章从创建应用开始,指导读者一步步搭建一个简单的静态页面,涵盖了导航配置、页面框架布局、内容填充等方面的知识点。 Knowledge Point 1: 创建应用 在浮木云平台上,创建应用是搭建静态页面的第一步。读者...

    一步步教你做库存资源管理系统(Spring+jsp+jstl)

    Spring MVC是Spring框架的一部分,专门用于实现MVC模式。通过配置Spring MVC,我们可以定义控制器类和方法,处理HTTP请求,并利用ModelAndView对象将数据传给视图。 在项目中,我们还需要一系列的依赖库来支持系统...

    asp.net3.5 MVC框架

    本教程主要介绍了如何通过一步步的学习过程来掌握 ASP.NET MVC 1.0 的基础知识,特别适合初学者。 #### 二、创建MVC Web Application 1. **创建项目**: 使用 Visual Studio 创建一个新的 ASP.NET MVC Web 应用程序...

    4.深度解密四:零基础3小时内学会如何自己独立建立一个网站.docx

    【零基础建立网站详解】 建立一个专业、美观的网站并非遥不...重要的是耐心学习,按照步骤一步步操作,理解每个环节的作用。记住,实践是掌握新技能的关键,所以不要害怕犯错,从错误中学习,你将更快地掌握建站技巧。

    一步步学习Struts2

    这个知识库“一步步学习Struts2”旨在帮助开发者从基础到深入理解并掌握Struts2框架的使用。 首先,Struts2是Struts1的升级版,它解决了Struts1的一些局限性,提供了更灵活的架构和更好的性能。Struts2的核心是...

    Maven+SpringMVC的HelloWord最简单入门小例子(包含两页面跳转)

    本教程将带你一步步了解如何使用Maven搭建项目环境,并结合SpringMVC实现一个简单的“Hello World”应用,其中包括两个页面的跳转。 首先,Maven是一个项目管理和综合工具,它帮助开发者管理项目的构建、依赖和文档...

    完整的SSH框架实例

    这个实例项目会引导你一步步构建一个完整的小型电商系统,例如"shop",包括用户登录注册、商品浏览、购物车、订单管理等功能。通过实践,你将深入理解SSH框架的集成与应用,为以后的Java Web开发打下坚实基础。

    构建基于Maven的SSH原型项目

    视频文件列表中的"01.wmv"、"02.wmv"、"04.wmv"、"03.wmv"可能分别介绍了这些步骤,从基础概念讲解到具体操作演示,帮助初学者一步步跟随视频完成SSH原型项目的构建。 学习这个主题,不仅可以提升Java Web开发技能...

    架构探险 从零开始写WEB框架

    在《架构探险:从零开始写WEB框架》中,作者引领读者深入理解Web框架的核心原理,逐步构建一个Java ...《架构探险:从零开始写Java Web框架》这本书正是这样一个指南,引导你一步步从基础到高级,探索Web框架的世界。

    一步一步叫你搭建struct+hernate+spring开发框架

    本教程将详细介绍如何一步步搭建基于Structs、Hibernate和Spring的开发框架。 首先,让我们了解一下这三个框架的基本概念: 1. **Structs**:这是一个MVC(Model-View-Controller)框架,主要用于Web应用的前端...

    java ssm框架搭建

    接下来,我们来详细讲解如何一步步搭建SSM项目: 1. 创建项目结构:通常,项目会按照Maven的约定来组织,包括src/main/java(源代码)、src/main/resources(资源配置)、src/main/webapp(Web应用目录)等。 2. ...

    一步步学习Asp.Net MVC

    Asp.Net MVC(Model-View-Controller)是一个用于构建动态网站的开源框架,它由微软开发,基于ASP.NET平台。这个框架提供了清晰的架构,使开发者可以更方便地分离业务逻辑、数据处理和用户界面,从而提高代码的...

    SSH框架整合增、删、改、查、登录.zip

    SSH框架整合是Java Web开发中常见的一种技术栈组合,它由Spring、Struts2和Hibernate三个框架...这个压缩包可能包含了一系列的Java源码、配置文件、HTML页面以及数据库脚本,帮助学习者一步步了解和实践SSH框架的整合。

    高仿Railay:整体框架小程序源码.zip

    【标题】"高仿Railay:整体框架小程序源码.zip" 涉及的主要知识点是微信小程序开发,尤其是基于特定框架的小程序...在实践中,可以对照源码一步步运行、调试,加深理解,并尝试修改和扩展功能,以达到更好的学习效果。

Global site tag (gtag.js) - Google Analytics