可重复使用程序代码 + 可重复使用模型 = 更高的生产力
许多朋友最近见到我的时候经常出现的话题之一就是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
分享到:
相关推荐
新质生产力水平测算与中国经济增长新动能的研究是当前经济学与统计学领域的重要...随着中国经济转型和升级的深入推进,对于新质生产力的研究将显得愈发重要,其研究成果对于推动中国经济高质量发展具有不可忽视的作用。
PLC是一种使用可编程存储器,用于存储执行逻辑运算、顺序控制、计时、计数和算术运算等操作指令,并能通过数字或模拟输入/输出,控制各种类型的机械或生产过程的数字运算操作电子系统。它是现代工业自动化的灵魂,...
### 高生产力的低代码开发平台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`文件则包含了...
我们可以预见,未来的低代码平台将拥有更高的智能化水平,能够更加精准地理解用户需求,并生成更加优化的代码。同时,低代码生成器也将更好地融入到整个软件开发生命周期中,从需求分析、设计、开发、测试到部署和...
H6光伏逆变器仿真模型的研究,旨在通过精确模拟来确保仿真模型与实际量产的逆变器在程序代码控制上的一致性,从而实现对电力转换效率与稳定性的深入分析与优化。这一研究不仅涉及到逆变器的基本工作原理,还涵盖了...
这要求模型具备良好的自适应能力和学习能力,能够快速吸收新的知识并转化为生产力。 在实际应用中,自动生成代码的AI模型还面临着一系列挑战和问题。例如,如何处理代码的通用性和特定场景的适配性问题,如何保证...
* 提高开发团队的生产力 * 提高客户满意度 软件测试模型的缺点包括: * 需要高水平的测试技术和经验 * 需要大量的测试资源和资金 * 需要与开发团队的紧密合作 * 需要不断的更新和改进 软件测试模型是软件开发过程...
这个工具能够自动化生成基础的业务代码,让开发者可以专注于更高层次的业务逻辑设计。 **Hibernate** 是一个强大的Java持久化框架,它简化了数据库操作,通过ORM(对象关系映射)技术将Java对象与数据库表对应起来...
Zino正是这样一个致力于提升开发者体验的下一代框架,它专为Rust设计,以实现简单性、可扩展性和高生产力为目标。本文将深入探讨Zino框架的核心特性、设计理念以及它如何在实际开发中发挥作用。 首先,让我们理解...
该算法可以帮助程序员快速生成程序代码,减少手动编写代码的工作量,从而提高编程效率和生产力。 一、程序流程图 程序流程图是一种可视化编程工具,通过图形符号表示程序的逻辑结构和执行过程。它可以帮助程序员...
在当前深度学习与人工智能技术的蓬勃发展下,将模型...学习者在实践这些源码和部署步骤时,不仅能够加深对TensorRT工具的理解,还能够加深对深度学习模型部署全流程的认识,从而在AI和机器学习领域中拥有更强的竞争力。
为了使用户更好地应用MA模型,文中提供了详细的代码示范和技术说明,并讨论了一些常见问题及其解决方案。整个项目的目标是为了帮助用户在实际场景下运用MATLAB来进行高质量、高准确度的时间序列预测。 适合人群:本...
此外,对常见任务的透明安全支持意味着开发者可以在编写代码时就考虑到安全因素,而无需牺牲生产力。例如,WinFX默认提供了防止缓冲区溢出等常见编程错误的功能,这样可以显著减少安全漏洞的发生。 WinFX还致力于...
2. **服务化封装**:将模型封装成API服务,使外部应用程序可以通过调用接口来使用模型。这通常涉及到定义输入输出格式、错误处理和性能监控等功能。 3. **负载均衡与扩展性**:当多个用户同时请求服务时,需要设计...
- **提高生产力**:自动化的代码生成减少了手动编写重复代码的时间。 - **一致性**:确保生成的代码遵循统一的编码标准和最佳实践。 - **降低错误率**:由机器生成的代码通常比人工编写的代码更少错误。 - **可扩展...
3. **源代码**:源代码是程序员编写的原始编程语言文本,可被编译器或解释器转化为可执行程序。在本案例中,源代码是实现CRM功能的核心部分,包括页面逻辑、数据库交互、用户界面等组件,对于学习、修改或扩展项目...