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

C#發現之旅第十二講:基於反射與動態編譯的快速ORM框架(下)第9部分

     編輯:關於C語言

動態編譯核心 BuildHelpers 實作

掃描註冊表中 Value 為 null 的類型 → 收集待編譯清單 → 生成唯一命名空間 Temp{GUID} → 呼叫 GenerateCode 產出原始碼 → 設定編譯參數(引用 mscorlib、System、System.Data、實體組件、框架組件)→ 呼叫 CSharpCodeProvider.CompileAssemblyFromSource(.NET 1.1/2.0 呼叫方式略異,2.0 相容 1.1 代碼)→ 檢查編譯錯誤 → 成功則反射取得各 XxxORMHelper 類型 → Activator.CreateInstance 建立實例 → 回填註冊表 → 列印建立日誌。

private int BuildHelpers(string strFileName) {
    var RecordTypes = new ArrayList();
    foreach (Type t in myRecordHelpers.Keys)
        if (myRecordHelpers[t] == null) RecordTypes.Add(t);
    if (RecordTypes.Count == 0) return 0;

    string nsName = "Temp" + Guid.NewGuid().ToString("N");
    string strSource = GenerateCode(nsName, strFileName, RecordTypes);

    var options = new CompilerParameters {
        GenerateExecutable = false,
        GenerateInMemory = true
    };
    // 收集引用組件...
    var provider = new CSharpCodeProvider();
    var result = provider.CompileAssemblyFromSource(options, strSource);

    if (result.Errors.Count == 0) {
        var asm = result.CompiledAssembly;
        myAssemblies.Add(asm);
        foreach (Type rt in RecordTypes) {
            Type helperType = asm.GetType(nsName + "." + rt.Name + "ORMHelper");
            var helper = (RecordORMHelper)Activator.CreateInstance(helperType);
            myRecordHelpers[rt] = helper;
            Console.WriteLine($"FastORM為\"{rt.FullName}\"創建操作幫助對象");
        }
    } else {
        Console.WriteLine("ORM框架動態編譯錯誤");
        foreach (string line in result.Output) Console.WriteLine(line);
    }
    provider.Dispose();
    return RecordTypes.Count;
}

資料庫操作進入點

編譯完成、輔助器就緒後,框架對外提供 ReadObjects、InsertObject、UpdateObject、DeleteObject 等高層 API,內部統一走「取得輔助器 → 建立命令 → 填充參數 → 執行」流程,實現高效能 ORM。

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