首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Winform CRM框架:基於插件化架構的模塊開發全流程實踐

     編輯:關於.NET

Winform開發框架確立「業務模塊零耦合、動態組合、增量生成」的插件化架構原則。本文以CRM模塊為例,完整記錄從項目工程劃分、數據庫建模、代碼生成工具批量生成分層代碼、界面層集成基礎模塊、到用戶權限上下文跨模塊傳遞的標準化開發全流程。

一、 解決方案工程結構劃分

框架體系架構圖

CRM系統獨立解決方案(WHC.CRM.sln),引用框架公共組件:

  • WHC.Framework.BaseUI:界面基類、權限接口、公共控件
  • WHC.Framework.ControlUtil:分頁控件、字典擴展、導入導出、高級查詢
  • WHC.Framework.Commons:公用類庫、實體基類、工具方法
  • WHC.Security.BLL/DAL/Entity:權限業務/數據/實體層
  • 其他:附件管理、自動更新、郵件服務等專項模塊

CRM系統整體界面

二、 項目工程佈局

CRM項目工程結構1

CRM項目工程結構2

  • WHC.CRM.BLL/DAL/Entity:業務邏輯、數據訪問、實體層(由Database2Sharp一次性生成全量表代碼)
  • WHC.CRM.UIDx:DevExpress風格界面層項目,引用界面程序集

業務邏輯層生成後結構清晰:

BLL層代碼結構

三、 代碼生成工具驅動界面層快速構建

利用 Database2Sharp 生成集成框架基類的標準界面代碼:

Database2Sharp界面生成配置

生成後界面項目目錄:

UIDx項目目錄結構

四、 界面層核心集成點代碼分析

1. 列表頁集成分頁控件與基類

列表頁基類繼承

2. 字典模塊整合(擴展方法模式)

字典擴展方法調用

3. 導入導出模塊整合

模板驅動導入,數據轉換驗證,異常跳過記錄:


private void btnImport_Click(object sender, EventArgs e) {
    FrmImportExcelData dlg = new FrmImportExcelData();
    dlg.SetTemplate(templateFile, Path.Combine(Application.StartupPath, templateFile));
    dlg.OnDataSave += ExcelData_OnDataSave;
    dlg.OnRefreshData += (s, e) => BindData();
    dlg.ShowDialog();
}

bool ExcelData_OnDataSave(DataRow dr) {
    string customerName = dr["客戶名稱"].ToString();
    if (string.IsNullOrEmpty(customerName)) return false;
    CustomerInfo customerInfo = BLLFactory<Customer>.Instance.FindByName(customerName);
    if (customerInfo == null) throw new ArgumentException($"客戶【{customerName}】不存在");
    
    ContractInfo info = new ContractInfo {
        Customer_ID = customerInfo.ID,
        HandNo = dr["合同編號"].ToString(),
        ContractMoney = dr["合同金額"].ToString().ToDecimal(),
        // ... 其他字段映射與類型轉換
    };
    return BLLFactory<Contract>.Instance.Insert(info);
}

導出支持字段別名轉義、數據源查詢條件透傳、Aspose.Cells生成Excel。

4. 高級查詢模塊整合


private FrmAdvanceSearch dlg;
private void btnAdvanceSearch_Click(object sender, EventArgs e) {
    if (dlg == null) {
        dlg = new FrmAdvanceSearch();
        dlg.FieldTypeTable = BLLFactory<Contract>.Instance.GetFieldTypeList();
        dlg.ColumnNameAlias = BLLFactory<Contract>.Instance.GetColumnNameAlias();
        dlg.DisplayColumns = "Customer_ID,HandNo,ContractMoney,...";
        dlg.ConditionChanged += (cond) => { advanceCondition = cond; BindData(); };
    }
    dlg.ShowDialog();
}

5. 編輯頁基類繼承體系

編輯頁基類繼承

五、 跨模塊用戶權限上下文傳遞機制

CRM界面層獨立於啟動器,需主動獲取登錄用戶與權限信息。框架定義 IFunction 接口,BaseForm 實現:


public interface IFunction {
    void InitFunction(LoginUserInfo userInfo, Dictionary<string, string> functionDict);
    bool HasFunction(string controlId);
    LoginUserInfo LoginUserInfo { get; set; }
    Dictionary<string, string> FunctionDict { get; set; }
    AppInfo AppInfo { get; set; }
}

啟動器創建MDI子窗體時統一注入:


Form tableForm = (Form)Activator.CreateInstance(formType);
tableForm.MdiParent = mainDialog;
IFunction function = tableForm as IFunction;
if (function != null) {
    function.InitFunction(Portal.gc.LoginUserInfo, Portal.gc.FunctionDict);
    function.AppInfo = new AppInfo(Portal.gc.AppUnit, Portal.gc.AppName, Portal.gc.AppWholeName, Portal.gc.SystemType);
}

主界面菜單調用加載子窗體


private void barCRMContact_ItemClick(object sender, ItemClickEventArgs e) {
    ChildWinManagement.LoadMdiForm(this, typeof(FrmCustomerContact));
}
private void barCRMCustomer_ItemClick(object sender, ItemClickEventArgs e) {
    ChildWinManagement.LoadMdiForm(this, typeof(FrmCustomerManage));
}

子窗體(如客戶管理)即可通過 LoginUserInfo.Name 獲取當前用戶,實現個人分組數據隔離:

客戶管理界面個人分組

六、 總結

該開發流程確立了「分層代碼一次性生成、界面基類統一集成、公共模塊零成本復用、權限上下文標準化傳遞」的規範化體系。新增業務模塊僅需:建表 → 生成代碼 → 調整界面邏輯 → 掛載菜單,極大提升了團隊協作效率與代碼質量一致性。

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