COM+ 核心理念:系統服務 (交易、物件池、安全、事件) 由運行時提供,開發者專注業務邏輯。宣告式程設計允許在元件碼中聲明需求 (如需交易),具體參數 (如連線字串) 延遲至部署階段由管理員在 COM+ 管理工具設定。
Construct(pCtorObj: IDispatch)ConstructString (唯讀)Construct 傳遞 IObjectConstructString 物件建立 ActiveX Library 專案,產出 DLL 註冊為 COM+ 應用程式。
Project → Import Type Library → COM+ Services Type LibraryCOMSVCSLib_TLB.pas) 含 IObjectConstruct, IObjectConstructString 介面定義File → New → MTS Data Module (或 Transactional Object)Project → Uses → COM+ Services Type LibraryImplements → Insert Interface → IObjectConstructtype
TMyComPlusObject = class(TMTSDataModule, IObjectConstruct)
private
FConstructString: IObjectConstructString; // 介面參考
FConnStr: WideString; // 解析出的連線字串
protected
// IObjectConstruct
function Construct(const pCtorObj: IDispatch): HResult; stdcall;
public
procedure GetConnectionString; // 對外公開方法
end;
function TMyComPlusObject.Construct(const pCtorObj: IDispatch): HResult;
begin
Result := S_OK;
// 從 pCtorObj 查詢 IObjectConstructString 介面
if Succeeded(pCtorObj.QueryInterface(IID_IObjectConstructString, FConstructString)) then
FConnStr := FConstructString.ConstructString; // 取得管理員設定的字串
end;
procedure TMyComPlusObject.GetConnectionString;
begin
if Trim(FConnStr) = '' then
ShowMessage('未設定物件建構字串')
else
ShowMessage('連線字串: ' + FConnStr);
// 實際應用:ADOConnection.ConnectionString := FConnStr;
end;
dcomcnfg)元件服務 → 電腦 → 我的電腦 → COM+ 應用程式 → 您的應用程式 → 元件Provider=SQLOLEDB; Data Source=MyServer; Initial Catalog=MyDB; User ID=sa; Password=secret;procedure TForm1.Button1Click(Sender: TObject);
begin
// DCOMConnection 已設定 RemoteServer = 'MyApp.MyComPlusObject'
DCOMConnection1.AppServer.GetConnectionString;
end;
| 場景 | 建構字串內容 | 用途 |
|---|---|---|
| 資料庫連線 | ADO/OLEDB 連線字串 | 開發/測試/正式環境零程式碼切換 |
| Web Service 端點 | URL + 認證 Token | 端點變更無需重新編譯客戶端 |
| 功能開關 | XML/JSON 設定 | 啟用/停用特定業務規則、除錯模式 |
| 多租戶隔離 | 租戶 ID + 專屬連線資訊 | 單一元件服務多租戶,部署時注入租戶配置 |
Construct 僅在物件**第一次被建立**時呼叫一次 (物件池機制)Reconfigure 方法或重啟 COM+ 應用程式COM+ IObjectConstruct 機制實現了「程式碼與配置分離」的最佳實踐。Delphi 透過 TMTSDataModule + 介面實作,以極少量代碼即可獲得企業級部署彈性。連線字串外部化只是冰山一角,任何部署期才能確定的參數 (端點、開關、租戶資訊) 皆適用此模式。