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

COM+ 參數化物件建構:IObjectConstruct 實作連線字串外部化

     編輯:Delphi

背景:宣告式程設計與 COM+ 服務

COM+ 核心理念:系統服務 (交易、物件池、安全、事件) 由運行時提供,開發者專注業務邏輯。宣告式程設計允許在元件碼中聲明需求 (如需交易),具體參數 (如連線字串) 延遲至部署階段由管理員在 COM+ 管理工具設定。

參數化物件建構機制

  • IObjectConstruct 介面:單一方法 Construct(pCtorObj: IDispatch)
  • IObjectConstructString 介面:單一屬性 ConstructString (唯讀)
  • 流程:管理員在元件屬性 → 啟用頁 → 勾選「物件建構」 → 輸入字串 → COM+ 執行時呼叫 Construct 傳遞 IObjectConstructString 物件

Delphi 實作步驟

1. 專案類型:ActiveX Library

建立 ActiveX Library 專案,產出 DLL 註冊為 COM+ 應用程式。

2. 匯入 COM+ 型別庫

  • Project → Import Type Library → COM+ Services Type Library
  • 建立單元 (COMSVCSLib_TLB.pas) 含 IObjectConstruct, IObjectConstructString 介面定義

3. 建立 MTS Data Module (或 COM+ 事件物件)

  • File → New → MTS Data Module (或 Transactional Object)
  • 在型別庫編輯器:Project → Uses → COM+ Services Type Library
  • 實作介面:Implements → Insert Interface → IObjectConstruct

4. 元件類別實作

type
  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;

部署設定 (管理員操作)

  1. 開啟 元件服務 (dcomcnfg)
  2. 展開 元件服務 → 電腦 → 我的電腦 → COM+ 應用程式 → 您的應用程式 → 元件
  3. 右鍵元件 → 內容 → 啟用 頁面
  4. 勾選 物件建構字串
  5. 輸入字串,例如:
    Provider=SQLOLEDB; Data Source=MyServer; Initial Catalog=MyDB; User ID=sa; Password=secret;
  6. 確定,COM+ 會在下次物件啟動時傳遞此字串

客戶端呼叫範例

procedure TForm1.Button1Click(Sender: TObject);
begin
  // DCOMConnection 已設定 RemoteServer = 'MyApp.MyComPlusObject'
  DCOMConnection1.AppServer.GetConnectionString;
end;

進階應用場景

場景建構字串內容用途
資料庫連線ADO/OLEDB 連線字串開發/測試/正式環境零程式碼切換
Web Service 端點URL + 認證 Token端點變更無需重新編譯客戶端
功能開關XML/JSON 設定啟用/停用特定業務規則、除錯模式
多租戶隔離租戶 ID + 專屬連線資訊單一元件服務多租戶,部署時注入租戶配置

優勢總結

  • 關注點分離:開發者不碰敏感連線資訊,管理員掌控部署配置
  • 環境遷移無痛:開發→測試→上線,僅修改 COM+ 管理工具設定
  • 安全性提升:連線字串不在原始碼、不在編譯輸出、不在客戶端
  • 動態更新:修改建構字串後,新建立的物件實例即時生效 (舊實例不受影響)

注意事項

  • Construct 僅在物件**第一次被建立**時呼叫一次 (物件池機制)
  • 若需運行時動態變更連線,需自行實作 Reconfigure 方法或重啟 COM+ 應用程式
  • 字串長度無硬性限制,但建議 < 4KB
  • Delphi 7+ 內建完整 COM+ 支援,舊版需安裝 COM+ 執行時

總結

COM+ IObjectConstruct 機制實現了「程式碼與配置分離」的最佳實踐。Delphi 透過 TMTSDataModule + 介面實作,以極少量代碼即可獲得企業級部署彈性。連線字串外部化只是冰山一角,任何部署期才能確定的參數 (端點、開關、租戶資訊) 皆適用此模式。

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