可重复使用程序代码 + 可重复使用模型 = 更高的生产力
许多朋友最近见到我的时候经常出现的话题之一就是ECO,他们告诉我ECO非常地令人兴奋,他们都非常想要试试ECO,但是令他们困扰的是除了中文参考数据不多之外,就是想询问我ECO的可使用性。例如他们很怕ECO只能使用在BDS 2006的应用程序中,其他的应用,例如MS的C#,VB.NET,或是WinCE是否能够使用。我告诉他们未来ECO会支持WinCE,此外ECO是纯粹的.NET应用程序,其他的.NET语言或是应用程序当然也可以使用,甚至连Win32的应用程序都可以使用ECO提供的服务。怎么做? 那当然就是使用Web Services了。
让我简单地用一个Win32的应用程序范例来说明如何使用ECO服务吧。下图是我经常使用的一个范例业务逻辑模型,请各位注意的是,我甚至可以使用OCL来定义类的方法运算,这样一来,这个类图就更容易移植到其他平台,例如Java平台。
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span style="FONT-FAMILY: 全真中明體"><img style="WIDTH: 571px; HEIGHT: 401px" height="323" alt="" width="446" src="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOT1qnlbCTq9FutM8SZmXRwc2sefsmASnOTyi-n4tahpOFaCsxGmjM2Q37t5BDpLE4C6uRC9_4WehUeT6dBlpqczIZckgP48JBj7DxsvzXD8TlSqt4yy-5mI"></span><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 442.5pt; HEIGHT: 320.25pt" alt="" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1.1F0%5CLOCALS~1%5CTemp%5Cmsohtml1%5C03%5Cclip_image001.jpg" o:href="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOT1qnlbCTq9FutM8SZmXRwc2sefsmASnOTyi-n4tahpOFaCsxGmjM2Q37t5BDpLE4C6uRC9_4WehUeT6dBlpqczIZckgP48JBj7DxsvzXD8TlSqt4yy-5mI"></imagedata></shape>
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 442.5pt; HEIGHT: 320.25pt" alt="" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1.1F0%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.jpg" o:href="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOT1qnlbCTq9FutM8SZmXRwc2sefsmASnOTyi-n4tahpOFaCsxGmjM2Q37t5BDpLE4C6uRC9_4WehUeT6dBlpqczIZckgP48JBj7DxsvzXD8TlSqt4yy-5mI"></imagedata></shape>
现在在BDS 2006中建立一个ECO ASP.NET Web Service应用程序(见下图):
<shape id="_x0000_i1026" style="WIDTH: 268.5pt; HEIGHT: 203.25pt" alt="" type="#_x0000_t75"><img style="WIDTH: 495px; HEIGHT: 359px" height="323" alt="" width="427" src="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOXPFxJogzxsokc27jFJDBxtSv8EdlCo_1eB3lxp2jxB3xp54J_IMhbhsCdUrO_eBy043UPtXI8hIZvT36qBsqPmi4m7vFSpATzqgjMm1UKPjRqoDvMb0Snk"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1.1F0%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image002.jpg" o:href="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOXPFxJogzxsokc27jFJDBxtSv8EdlCo_1eB3lxp2jxB3xp54J_IMhbhsCdUrO_eBy043UPtXI8hIZvT36qBsqPmi4m7vFSpATzqgjMm1UKPjRqoDvMb0Snk"></imagedata></shape>
然后在产生的Web Services中(*.asmx文件)加入如下的Web Services方法:
[WebMethod]
function GetDevCoSeminarCount : Integer;
[WebMethod]
function GetDevCoSeminar : TDevCoSeminarList;
然后实现如下:
function TDevCoSeminarService.GetDevCoSeminar: TDevCoSeminarList;
const
SEMINARCOUNT = 'DevCoSeminar.allInstances';
var
OclService: IOclService;
ResultElement: IElement;
begin
OclService := EcoSpace.GetEcoService(typeof(IOclService)) as IOclService;
ResultElement := OclService.EvaluateAndSubscribe(nil, SEMINARCOUNT, nil, nil);
Result := CreateDevCoSeminarDTOs(ResultElement);
DoneWithEcoSpace;
end;
function TDevCoSeminarService.CreateDevCoSeminarDTOs(
ResultElement: IElement): TDevCoSeminarList;
var
al : TDevCoSeminarList;
anElement : IElement;
aSeminar : DevCoSeminar;
aDTO : TDevCoSeminar;
iIndex : Integer;
begin
SetLength(al, ResultElement.GetAsCollection.Count);
iIndex := 0;
for anElement in ResultElement.GetAsCollection do
begin
aSeminar := anElement.AsObject as DevCoSeminar;
aDTO.FName := aSeminar.Name;
aDTO.FLocation := aSeminar.Location;
aDTO.FSrDate := aSeminar.srDate.ToLongDateString;
aDTO.FMaxCount := aSeminar.MaxCount;
al[iIndex] := aDTO;
Inc(iIndex);
end;
Result := al;
end;
接着编译这个ECO Web Service应用程序,等待稍后的Win32客户端应用程序调用,使用它提供的服务。
现在我再使用Delphi 7(或是BDS 2006中的Delphi For Win32)建立一个VCL Form应用程序,启动WSDL Importer向导输入刚才开发的ECO Web Service应用程序的WSDL:
<shape id="_x0000_i1031" style="WIDTH: 327.75pt; HEIGHT: 232.5pt" alt="" type="#_x0000_t75"><img height="323" alt="" width="459" src="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOcZhj_hKVZ7B0qUoCdNVXgpiFjJg1QmaEyJsmeWxDbbZxqMy1i7uI7NWNXHtO0ZY_i7I90RfAbCHSWEax3YlMTwSh26Zi8_TYaPBlQXuYxEgqK_zmttZs2Y"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1.1F0%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image004.jpg" o:href="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOcZhj_hKVZ7B0qUoCdNVXgpiFjJg1QmaEyJsmeWxDbbZxqMy1i7uI7NWNXHtO0ZY_i7I90RfAbCHSWEax3YlMTwSh26Zi8_TYaPBlQXuYxEgqK_zmttZs2Y"></imagedata></shape>
接着在VCL窗体中实现如下的程序代码来调用ECO Web Service应用程序:
procedure TForm1.Button1Click(Sender: TObject);
var
aWS : TDevCoSeminarServiceSoap;
wsResult : ArrayOfTDevCoSeminar;
icount : Integer;
aSeminar : TDevCoSeminar;
sData : String;
begin
aWS := GetTDevCoSeminarServiceSoap;
edtCount.Text := IntTostr(aWS.GetDevCoSeminarCount);
wsResult := aWS.GetDevCoSeminar;
for iCount := Low(wsResult) to High(wsResult) do
begin
aSeminar := wsResult[iCount];
sData := aSeminar.FName + ':' + aSeminar.FSrDate + ':' +
aSeminar.FLocation + ':' + IntToStr(aSeminar.FMaxCount);
ListBox1.Items.Add(sData);
end;
end;
上面的TDevCoSeminarServiceSoap就是WSDL Importer向导封装远程Web Service应用程序的wrapper类。编译并且执行这个Delphi 7的Web Service客户端应用程序,我们可以看到如下图所示的执行结果,ECO的服务果然成功地被Delphi Win32的应用程序调用、使用了。
<shape id="_x0000_i1032" style="WIDTH: 245.25pt; HEIGHT: 110.25pt" alt="" type="#_x0000_t75"><img alt="" src="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOUBhfWVnAHcAAgA4P4-TO3VykDixl806-uLhgaeb3Vd-c2qPaKktPkTWIKX-UQ_jKQjgDR9xMOugW_lAIYN0-t2poArHL1BYEE54bbl45jhn4ONPQCSkkkY"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1.1F0%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image006.jpg" o:href="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOUBhfWVnAHcAAgA4P4-TO3VykDixl806-uLhgaeb3Vd-c2qPaKktPkTWIKX-UQ_jKQjgDR9xMOugW_lAIYN0-t2poArHL1BYEE54bbl45jhn4ONPQCSkkkY"></imagedata></shape>
Yah, 我们在Windows 32下使用Delphi 7就完成了使用由.NET ECO/MDA/DDA实现的业务逻辑服务。ECO强大的可重复使用性再次令人印象深刻。
了解了上面的讨论之后,各位有使用VS.NET的朋友当然也可以使用VS.NET的VB.NET或是MS C#来使用ECO提供的服务了。
使用了ECO技术,ECO不但是“Write code once and Run everywhere”,甚至是“Model 你的business logic once and reuse everywhere”,“Reuse Code + Reuse Model”那不是让开发人员的生产力更为提高吗?
李维先生简体版博客由博文视点陈元玉编辑负责繁转简以及版式设计,如有疑问敬请您与编辑联系,联系方式:chenyy@broadview.com.cn
分享到:
相关推荐
18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...
和Windows NT一样,Windows 95也支持Intel 386或更高等级处理器的32位保护模式。虽然它缺少Windows NT中的某些功能,诸如高安全性和对RISC机器的可移植性等,但是Windows 95具有需要较少硬件资源的优点。 Windows ...
透过关键字建议和减少重复输入相同的代码,自动完成代码和自定义的代码段功能可让编码更加快速。我们的调试组件能快速寻找和更正 PL/SQL 和 PL/PGSQL 编码时的错误,你可设置断点,逐步运行程序,查看和修改变量值,...
在模型窗口中输入如下代码: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的按钮 即可。 例1.2 使用LINGO软件计算6个发点8个收点的最小费用运输问题。产销单位运价如下表。 单 位 销地 运 ...
由于该软件通过大量的实践被证实具有较好的实用性,现在世界上许多生产企业、研究机构和高校都在使用该软件做汽车仿真方面的研究。 ADVISOR是MATLAB和SIMULINK软件环境下的一系列模型、数据和脚本文件,它在给定的道路...
$#,##0.00_)” 使用条件运算符也可以作为缩放数值的强有力的辅助方式,例如,如果所在单位生产几种产品,每个产品中只要几克某化合物,而一天生产几千个此产品,那么在编制使用预算时,需要从克转为千克、吨,这时...
//数据的有效性不再符合要求//网络或应用程序平台是不可靠的//其他应用程序要求使用不同结构的数据//网络带宽不能满足实时数据访问的性能要求//允许一定的延迟//对数据的更改一般不会存在冲突//其他应用程序只要求读...
使用keil c51 v7.50 + proteus 6.7 可以像使用仿真器一样调试程序,可以完全 仿真单步调试,进入中断等各种调试方案。 Proteus 与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU 的工 作情况,也能仿真单片机...
1.1 工业机器人的工作原理 现代工业自动化领域中应用的各种操作机器人是 目前工业机器人技术中最 成熟的一类 , 这种工业机器 人实质上是一类能根据预先将程序编制在存储装置 中,然后操作程序自动重复执行 , 进行...
� 源代码完全开放,便于开发人员更清楚的把握实现细节,便于提高开发人员的技术水平,有利于开发 出 更具差异性的应用。 � 采用了对有限内存、电池和 CPU 优化过的虚拟机 Dalvik , Android 的运行速度比想象的要...
推倒重来则意味着前期人、财、物的投入全部浪费了,即大大增加了软件的开发成本,又会因为超出了客户的委托时间,付出的代价就更高了。 武友文以自己在国际公司的实践经验,一再强调,软件测试是软件开发过程中的...
同时,锐智企业建站系统灵活的、可伸缩的产品架构、强健的系统内核、严谨的安全策略、灵活的内置模型、高效信息处理能力、便利的操作管理特性、专业严密的安全性等诸多特性,可以最大化满足各类企业网站展示、共享的...
"学号 "姓名 "负责部分 "成绩 " "组长 " " "数据库代码 " " "组员 " " "数据库界面程序 " " " " " "文档制作 " " "指导教师评语: " " " " " " " " " " " " " " " " " " " " " " " " " " " 摘 要 信息化的今天,...
3.4.2.6 2014移动生产力十大优秀案例奖 19 3.4.3投标单位综合情况审查表 19 3.4.4拟派项目经理资格审查表 20 3.4.5承担本项目主要技术人员和售后服务人员表 20 3.4.6最近两年主要开发实施同类型企业相同或类似...