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)、代碼實現 (增刪改查/主從同步/自動儲存) 到運行效果的全流程。
EcoCRM (路徑全英文,避免 Bug)。CoreClasses.pas (UML 模型代碼)、EcoCRMEcoSpace.pas (EcoSpace 容器)、WinForm.pas (主視窗)、ECO 執行期組件 (Core/Handles/Interfaces/OCL/Persistence)。| 類別 | 屬性 | 關聯 |
|---|---|---|
| Customer (抽象) | Name, Phone, Address | 父類 |
| Person | Sex | Generalization → Customer |
| Company | — | Generalization → Customer |
| Car | ID, Name, CarType | — |
| CarSell | BuyDate, Fee | Association → 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 |
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;
AutoContainerService.Instance.CreateContainer(EcoSpace, cmhCompanyCarSell.Element).ShowDialog。| 優點 | 缺點/風險 |
|---|---|
| 模型即代碼,設計與實現零差距 | Delphi 8 ECO 存在多個 Bug (全路徑中文導致編譯錯誤、設計器閃退) |
| 資料庫平台無關 (換 PersistenceMapper 即可) | 不支援 ASP.NET Web 應用 (後續版本承諾支援) |
| OCL 查詢語言強大、類 SQL 且物件導向 | 學習曲線陡峭、文檔不足、社群小 |
| 自動 UI 綁定、主從同步零代碼 | 效能調優空間有限、大規模專案擴展性待驗證 |
| 變更管理:修改模型自動遷移資料庫結構 | Borland 後續重心轉移,ECO 發展緩慢 |
ECO 是 Delphi 歷史上最野心勃勃的 MDA 嘗試,雖未成主流,但其「模型驅動、持久化無關、UI 自動綁定」理念深刻影響後續 ORM 與低代碼平台設計。維護舊 ECO 專案時,理解其核心組件 (EcoSpace/Handle/Mapper) 交互關鍵。