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

本文详细阐述了页面与页面服务的接口定义、页面基类与页面服务基类的实现,包括页面与服务通信与函数调用的基本功能,并通过单元测试验证了其正确性。
原帖地址: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!享受我们的成果吧!



 

本文链接

【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)内容概要:本文介绍了基于蒙特卡洛和拉格朗日方法的电动汽车充电站有序充电调度优化方案,重点在于采用分散式优化策略应对分时电价机制下的充电需求管理。通过构建数学模型,结合不确定性因素如用户充电行为和电网负荷波动,利用蒙特卡洛模拟生成大量场景,并运用拉格朗日松弛法对复杂问题进行分解求解,从而实现全局最优或近似最优的充电调度计划。该方法有效降低了电网峰值负荷压力,提升了充电站运营效率经济效益,同时兼顾用户充电便利性。 适合人群:具备一定电力系统、优化算法和Matlab编程基础的高校研究生、科研人员及从事智能电网、电动汽车相关领域的工程技术人员。 使用场景及目标:①应用于电动汽车充电站的日常运营管理,优化充电负荷分布;②服务于城市智能交通系统规划,提升电网交通系统的协同水平;③作为学术研究案例,用于验证分散式优化算法在复杂能源系统中的有效性。 阅读建议:建议读者结合Matlab代码实现部分,深入理解蒙特卡洛模拟拉格朗日松弛法的具体实施步骤,重点关注场景生成、约束处理迭代收敛过程,以便在实际项目中灵活应用改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值