可重复使用程序代码 + 可重复使用模型 = 更高的生产力
许多朋友最近见到我的时候经常出现的话题之一就是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
分享到:
相关推荐
### 高生产力的低代码开发平台lowcode-engine知识点解析 #### 一、lowcode-engine概述 **lowcode-engine**是一款由阿里巴巴开源的低代码开发平台,致力于提高开发效率,降低开发门槛。它允许非专业开发人员通过...
此外,Visual C++还包括调试器、资源编辑器、性能分析工具等一系列辅助开发工具,极大地提升了开发者的生产力。 在文件名"SXBG"中,我们无法直接推断具体内容,但它可能代表书中的一个示例项目或章节名称。在学习和...
此压缩包"使用更少的样板代码、更高的一致性和对REST API的支持,编写更优雅的AzureFunctions.zip"显然是一个关于优化 Azure Functions 开发流程的项目,名为 "FunctionMonkey-master",可能包含一个框架或工具,...
这些程序可能包含了实现上述模型的代码,例如`MS_DFM_GDP.gau`可能是专门处理GDP数据的马尔科夫转换混频动态因子模型,而`strategy*`系列文件可能包含了不同的建模策略或参数设置。 `.xls`和`.xlsx`文件则包含了...
* 提高开发团队的生产力 * 提高客户满意度 软件测试模型的缺点包括: * 需要高水平的测试技术和经验 * 需要大量的测试资源和资金 * 需要与开发团队的紧密合作 * 需要不断的更新和改进 软件测试模型是软件开发过程...
这个工具能够自动化生成基础的业务代码,让开发者可以专注于更高层次的业务逻辑设计。 **Hibernate** 是一个强大的Java持久化框架,它简化了数据库操作,通过ORM(对象关系映射)技术将Java对象与数据库表对应起来...
Zino正是这样一个致力于提升开发者体验的下一代框架,它专为Rust设计,以实现简单性、可扩展性和高生产力为目标。本文将深入探讨Zino框架的核心特性、设计理念以及它如何在实际开发中发挥作用。 首先,让我们理解...
该算法可以帮助程序员快速生成程序代码,减少手动编写代码的工作量,从而提高编程效率和生产力。 一、程序流程图 程序流程图是一种可视化编程工具,通过图形符号表示程序的逻辑结构和执行过程。它可以帮助程序员...
此外,对常见任务的透明安全支持意味着开发者可以在编写代码时就考虑到安全因素,而无需牺牲生产力。例如,WinFX默认提供了防止缓冲区溢出等常见编程错误的功能,这样可以显著减少安全漏洞的发生。 WinFX还致力于...
2. **服务化封装**:将模型封装成API服务,使外部应用程序可以通过调用接口来使用模型。这通常涉及到定义输入输出格式、错误处理和性能监控等功能。 3. **负载均衡与扩展性**:当多个用户同时请求服务时,需要设计...
- **提高生产力**:自动化的代码生成减少了手动编写重复代码的时间。 - **一致性**:确保生成的代码遵循统一的编码标准和最佳实践。 - **降低错误率**:由机器生成的代码通常比人工编写的代码更少错误。 - **可扩展...
3. **源代码**:源代码是程序员编写的原始编程语言文本,可被编译器或解释器转化为可执行程序。在本案例中,源代码是实现CRM功能的核心部分,包括页面逻辑、数据库交互、用户界面等组件,对于学习、修改或扩展项目...
这些特性大大提升了开发者的生产力,使得代码更加简洁和易于理解。 1. **LINQ**:这是一个强大的查询工具,允许开发者使用熟悉的语言结构进行数据库、XML、集合等多种数据源的查询,提高了代码的可读性和可维护性。...
《.NET代码生成器——高效开发的利器》 在软件开发过程中,代码编写是一项耗时且繁琐的工作,尤其是在处理大量重复性代码时。...掌握并熟练运用代码生成器,将对提升个人和团队的生产力产生深远影响。
《Pro/Engineer二次开发技术基础中的源代码解析》 在计算机辅助设计(CAD)领域,Pro/...无论是为了提高生产力,还是为了实现创新的设计理念,理解和应用ProToolkit源代码都将为CAD领域的专业人士开启新的可能。
动软.Net代码生成器是一款专为.NET开发人员设计的强大工具,旨在提高开发效率,减少重复编码的工作量。...使用该工具,开发者可以更专注于业务创新,而不是基础代码的编写,从而实现更高的生产力。
【标题】:“轧制力MATLAB粒子群优化” 在钢铁行业中,平整机是重要的生产设备,其主要作用是对金属板材进行...在实际操作中,这样的模型和算法可以进一步结合机器学习和大数据分析,以实现更高级别的自动化和智能化。
首先,Scala的设计目标是提高开发者的生产力,它简化了Java的复杂性,同时引入了许多现代编程理念。在面向对象方面,Scala支持类、对象、继承和多态等概念,但在语法上更加简洁。在函数式编程方面,Scala提供了高阶...
总的来说,流风代码生成器是一个高效实用的开发辅助工具,它通过自动化代码生成,减少了手动编码的时间和错误,提升了开发团队的整体生产力。在面对大量重复性工作时,这样的工具无疑能成为开发者的得力助手。