首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 8 ECO 實戰:模型驅動架構 (MDA) 開發汽車銷售客戶管理系統

     編輯:Delphi

Borland Delphi 8 for .NET 引入 ECO (Enterprise Core Objects),基於 Bold 技術實現模型驅動架構 (MDA):以 UML 類別圖為核心,自動生成業務物件、持久化映射 (XML/SQL Server/Oracle)、WinForms/UI 綁定、OCL 查詢、自動表單等。本文完整演示從需求分析、ECO 應用精靈建立專案、UML 建模、關聯設計、PersistenceMapper 設定、UI 綁定 (ExpressionHandle/CurrencyManagerHandle)、代碼實現 (增刪改查/主從同步/自動儲存) 到運行效果的全流程。

專案建立

  1. File → New → Other → ECO Windows Application → 專案名 EcoCRM (路徑全英文,避免 Bug)。
  2. 精靈產生:CoreClasses.pas (UML 模型代碼)、EcoCRMEcoSpace.pas (EcoSpace 容器)、WinForm.pas (主視窗)、ECO 執行期組件 (Core/Handles/Interfaces/OCL/Persistence)。

需求分析與 UML 建模

建模操作

  • Model View → 雙擊 CoreClasses 開啟設計面。
  • Toolbox:ECO Package、Class、Generalization、Association、Note。
  • Class 右鍵 Add Attribute,設 Name/Type/Alias (中文別名)。
  • Association 連線後設定兩端 Multiplicity:0..1、1..1、0..*、1..*。

持久化映射:PersistenceMapperXML

  • 雙擊 EcoCRMEcoSpace.pas 切換設計視圖。
  • Toolbox → PersistenceMapperXML,FileName = EcoCrmData.xml。
  • TEcoCRMEcoSpace.PersistenceMapper := PersistenceMapperXML。
  • 未來遷移 SQL Server:改用 PersistenceMapperSqlServer,僅修改此處。

WinForms UI 綁定架構

類別屬性關聯
Customer (抽象)Name, Phone, Address父類
PersonSexGeneralization → Customer
Company—Generalization → Customer
CarID, Name, CarType—
CarSellBuyDate, FeeAssociation → Customer (0..* / 1)
Association → Car (0..* / 1)
組件角色關鍵屬性
ReferenceHandle (rhRoot)根資料源EcoSpaceType = EcoCRMEcoSpace.TEcoCRMEcoSpace
ExpressionHandle (ehXXX)OCL 查詢結果集RootHandle=rhRoot, Expression='Person.allInstances'
CurrencyManagerHandle (cmhXXX)主從同步游標RootHandle=ehParent, BindingContext=DataGridParent
DataGrid顯示/編輯DataSource=ehXXX
EcoAutoFormExtender雙擊 DataGrid 標題自動彈出屬性編輯對話框EcoAutoForm=True

核心綁定代碼 (Form Create 或設計時屬性)


ehPersons.Expression := 'Person.allInstances';       ehPersons.RootHandle := rhRoot;
ehCompanys.Expression := 'Company.allInstances';     ehCompanys.RootHandle := rhRoot;

cmhCompany.RootHandle := ehCompanys;  cmhCompany.BindingContext := dgCompanys;
ehCompanyCarSells.Expression := 'self.CarSell';       ehCompanyCarSells.RootHandle := cmhCompany;

cmhCompanyCarSell.RootHandle := ehCompanyCarSells;  cmhCompanyCarSell.BindingContext := dgCompanyCarSells;
ehCompanyCars.Expression := 'self.Car';               ehCompanyCars.RootHandle := cmhCompanyCarSell;

cmhPerson.RootHandle := ehPersons;    cmhPerson.BindingContext := dgPersons;
ehPersonCarSells.Expression := 'self.CarSell';        ehPersonCarSells.RootHandle := cmhPerson;

cmhPersonCarSell.RootHandle := ehPersonCarSells;    cmhPersonCarSell.BindingContext := dgPersonCarSells;
ehPersonCars.Expression := 'self.Car';                ehPersonCars.RootHandle := cmhPersonCarSell;

增刪改查極簡代碼


// 新增 Person (無主物件)
Person.Create(EcoSpace);

// 刪除 Person
Person(cmhPerson.Element.AsObject).AsIObject.Delete;

// 新增 CompanyCarSell (有主物件 Company)
CarSell.Create(EcoSpace).Customer := Customer(cmhCompany.Element.AsObject);

// 儲存所有變更
EcoSpace.UpdateDatabase;

運行效果

  • 選擇 Company → 下方 CarSell Grid 自動顯示該公司銷售記錄 → 選擇 CarSell → 再下方 Cars Grid 顯示該記錄車輛。
  • 雙擊 DataGrid 標題 → ECO 自動生成屬性編輯對話框 (EcoAutoForm)。
  • 手動呼叫 AutoForm:AutoContainerService.Instance.CreateContainer(EcoSpace, cmhCompanyCarSell.Element).ShowDialog。

ECO 優缺點與版本現狀

優點缺點/風險
模型即代碼,設計與實現零差距Delphi 8 ECO 存在多個 Bug (全路徑中文導致編譯錯誤、設計器閃退)
資料庫平台無關 (換 PersistenceMapper 即可)不支援 ASP.NET Web 應用 (後續版本承諾支援)
OCL 查詢語言強大、類 SQL 且物件導向學習曲線陡峭、文檔不足、社群小
自動 UI 綁定、主從同步零代碼效能調優空間有限、大規模專案擴展性待驗證
變更管理:修改模型自動遷移資料庫結構Borland 後續重心轉移,ECO 發展緩慢

後續版本演進

  • Delphi 2005/2006:ECO II/III,增強 ASP.NET 支援、效能優化、更多 UI Extender。
  • Delphi 2007+:ECO 整合至 RAD Studio Architect 版,持續更新至 10.4 Sydney。
  • 現代替代:Entity Framework Core (EF Core) + 模型優先、XPO (DevExpress)、RemObjects Data Abstract。

ECO 是 Delphi 歷史上最野心勃勃的 MDA 嘗試,雖未成主流,但其「模型驅動、持久化無關、UI 自動綁定」理念深刻影響後續 ORM 與低代碼平台設計。維護舊 ECO 專案時,理解其核心組件 (EcoSpace/Handle/Mapper) 交互關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved