我正在将用 Delphi 2010 编写的 win32 Delphi VCL 应用程序迁移到多层架构。
该应用程序广泛使用 devexpress 的 ExpressGrids (TcxGrid) 进行数据绑定。
- 我设计了基于实体框架的数据层,使用 dbContext 和数据传输对象。
- 我已经使用基于实体数据模型的 T4 模板通过 WCF 公开了 CRUD 操作。
一切正常,Delphi 客户端成功与 WCF 服务通信,交换数据传输对象。
问题是,我如何维护数据绑定功能?我倾向于编写一个返回通用数据表或数据集的服务方法。我可以将 linq 语句结果转换为数据集、表或视图吗?我不确定是否可以将 Expressgrids 绑定到对象数组(WCF 返回实体集合,但 Delphi 看到数组)。有没有人有过这种互操作性的经验?
编辑
我有返回数据集的数据服务,但你猜怎么着?来自 .net 的 xml 数据集与 Delphi(至少 2010 年)不兼容。我已经设法使用Gekko example (modified)使其工作,但由于我们需要从客户端运行的查询的复杂性,它并不实用。我们现在的选择是让网格保持原样,直到 BLL 完成并启动一个新项目以用 C# 重新编写客户端(作为 Web 或 Windows 应用程序),或者使用 RemObjects Hydra 编写一个通用网格插件,以嵌入带有网格的表格中-现在试图弄清楚。
更新 我已经放弃了 Gekko DataSet 实现,转而通过研究 Delphi 中 TClientDataSet 所需的 xml 格式来编写我自己的实现。在服务器端,我实现了一个服务,它以字节数组的形式返回符合 TClientDataSet 的 xml。在客户端上,我将其加载到 TStringStream 中,然后将流加载到 TclientDataSet 组件中。在我们推出 Hydra 解决方案时,我将它用于小型集合以提供查找和数据绑定。
xml大致遵循这种格式:
"2.0">
<METADATA>
<FIELDS>
<FIELD attrname="ID" fieldtype="i4"/>
<FIELD attrname="Status" fieldtype="string" WIDTH="10"/>
<FIELD attrname="Created" fieldtype="date"/>
<ROWDATA>
<ROW RowState="4" ID="1" Status="Code1" Created="20130707" Made="20130707T21:37:55341" Stopped="00:00:00000" Volume="1174" IsReady="TRUE"/>
<ROW RowState="4" ID="2" Status="Code2" Created="20130707" Made="20130707T21:37:55341" Stopped="00:00:00000" Volume="2149" IsReady="FALSE"/>
这是有关 xml 格式的少数信息来源之一。
我知道这个问题很老,但我会很感激任何关于互操作性和遗留代码迁移的见解。
谢谢