是"渔"非"鱼"--QPG分布处理框架V1.1(Beta1)简介
摘要:
看到最近不少上进的朋友相继推出了功的能强大的框架,我在此不想也卖一番广告。
QPG框架定位十分明确:
QPG框架的根本目标:
学习简单;开发快速且有质量!
QPG框架要做--可以接入各种客户端请求的服务中介
QPG框架不做--IoC容器、AOP框架、ORM框架、各种实用工具(日期、上载、货币等)
一)思路讲解
分布式处理框架的想法是在作者在房产中介那里受到启发而产生的:
和本系统有关的是几个重要概念:
消费者 ----请求服务
服务中介----对服务请求挂牌
服务者 ----处理自己感兴趣的服务请求
实际就可能出现:
一个应用既是消费者,又是服务者。
一个服务者为多个消费者进行服务
多个服务者为一个消费者进行服务
二)何时使用本框架
a) 如果你的系统UseCase小于20个,那你就没有必要用这个框架,我们假设你面对的是比较庞大的系统功能要求;
b) 如果你的系统对可靠性要求很高但是对处理速度不太苛刻,可以考虑。
c) 你希望学习和理解,一旦你掌握了思路,你完全可以用其他平台下的更强大的框架,也可以自己写一个框架。我们框架集成了Castle,总代码约2000行,十分简单.
二) 代码示例
a) 服务端
2namespace Demo.Facade {
3
4 using System;
5 using System.Data;
6 using QPG.Services;
7 using QPG.Utility;
8 using QPG.Interface;
9 using Demo.BizRule;
10 using Demo.DAS;
11
12 public class MyService:BaseAutoService {
13 private static Demo.BizRule.UserMgr um=new UserMgr();
14 private static Demo.DAS.TableDAO dao=new TableDAO(".","sa","");
15 public MyService(IMessageQueue mq,ILogService log):base("demo.mytest",mq,log) {
16
17 }
18 private void Func1(DTO data,ParametersHelper h) {
19 ParametersHelper rt=new ParametersHelper();
20
21 bool exist=um.Exist(h["UserID"].ToString());
22 rt.addParameter(new Parameter("ExistResult",exist));
23
24 if(exist) rt.addParameter(new Parameter("VerifyResult",um.Verify(h["UserID"].ToString(),h["Password"].ToString())));
25
26 data.setOutputData(rt.Items,null);
27 }
28 private void Func2(DTO data,ParametersHelper h) {
29 ParametersHelper rt=new ParametersHelper();
30
31 DataSet ds=dao.getData(h["TableName"].ToString());
32 rt.addParameter(new Parameter("Records",ds.Tables[0].Rows.Count));
33
34 data.setOutputData(rt.Items,ds);
35 }
36
37 public override QPG.Utility.DTO handle(QPG.Utility.DTO data) {
38 ParametersHelper h=new ParametersHelper(data.RequestArgs);
39
40 string method=h["Method"].ToString();
41 if(method.Equals("GetData")) Func2(data,h);
42 else Func1(data,h);
43
44 return data;
45
46 }
47 public override int getErrorCode(Exception ex) {
48 int rt= base.getErrorCode(ex);
49 if(rt==9999) {
50 //put your code here! like ADO exception
51 }
52 return rt;
53 }
54 public override string checkParameters(ParametersHelper ph) {
55 string rt=string.Empty;
56 //put your code here! like:
57
58 // Parameter p=ph.getParameter("F(x,y)");
59 // if(p==null) return "没有定义函数!";
60 // p=ph.getParameter("x");
61 // if(p==null) return "没有x!";
62 // p=ph.getParameter("y");
63 // if(p==null) return "没有y!";
64 return rt;
65 }
66 }
67}
68
b) 消费端
2 DTO d=new DTO();
3 Parameter[] ps=new Parameter[]{new Parameter("F(x,y)",txtF.Text),
4 new Parameter("x",int.Parse(tX.Text)),
5 new Parameter("y",int.Parse(tY.Text)),
6 };
7 d.setInputData(ps,null);
8 DTO rt=container.handle("demo.math",d);
9 if(rt==null) txtMsg.Text="Time out!";
10 else {
11 ParametersHelper ph=new ParametersHelper(rt.ResponseArgs);
12 txtMsg.Text=ph.ToString();
13 }
14 }
三) 配置讲解和示例下载
a) 下载示例源代码
b) 运行MQ-bin
c) 运行Demo.BasicHost
d) 运行DemoUI,试试基本的概念,如果要获取数据表,请确保账号sa密码空,否则要修改一下
以上演示一个远程计算,如果要本地计算则在配置文件里去掉注释:
<configuration>
<components>
<!--
<component id="demo.math"
type="QPG.Services.MathService, QPG.Common">
</component>
-->
</components>
</configuration>
以上演示一个远程计算报错。
以上演示一个远程获取数据。
以上演示使用Socket执行认证。你可以看到协议的XML:
e) 运行Demo.BankHost看看高级演示
alex 2005-12-29