设计数据库存取层生成工具(三) 生成业务方法
时间:2011-04-04 来源:hejiang's blog
首先使用Emit生成一个业务类。显然这个类应该从我们预先准备好的DbOperation继承而来,以便支持事务:
public TypeBuilder BuildClass(ModuleBuilder module, string typeName)
{
TypeBuilder type = module.DefineType(typeName,
TypeAttributes.Public | TypeAttributes.AutoClass |
TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit,
typeof(DbOperation));
BuildConstructor(type);
return type;
}
然后我们来生成一个业务方法:
public void BuildMethod(TypeBuilder type,
string methodName, string methodType,
string sqlText, CommandType sqlType,
IList<DbParamEntry> sqlParams,
string retTypeName, string retTypeFlag)
{
// 1. build parameter name and type array
string[] methodParamNames = new string[sqlParams.Count];
Type[] methodParamTypes = new Type[sqlParams.Count];
for (int i = 0; i < sqlParams.Count; ++i)
{
DbParamEntry pe = (DbParamEntry)sqlParams[i];
// build methodParamNames
char[] arr = pe.Name.ToCharArray(1, pe.Name.Length - 1);
arr[0] = char.ToLower(arr[0]);
methodParamNames[i] = new string(arr);
methodParamTypes[i] = ConvertDbTypeToDotNetType(pe.DbType);
}
// 2. get return type
string dbCommandMethodName = GetDbOperationMethodName(methodType);
Type originalType = GetDbCommandReturnType(dbCommandMethodName);
Type returnType = GetReturnType(originalType,
methodName, methodParamTypes, retTypeName, retTypeFlag);
// 3. create method and set parameter name
MethodBuilder mBuilder = type.DefineMethod(methodName,
MethodAttributes.Public | MethodAttributes.HideBySig,
returnType, methodParamTypes);
for (int i = 0; i < methodParamNames.Length; ++i)
mBuilder.DefineParameter(i + 1, ParameterAttributes.None,
methodParamNames[i]);
// 4. get ILGenerator
ILGenerator gen = mBuilder.GetILGenerator();
// 5. Call Db Command Method
EmitCallDbCommandMethod(gen, dbCommandMethodName,
sqlText, sqlType, sqlParams);
// 7. Convert return type
EmitConvertReturnType(gen, methodName, originalType, returnType);
// 8. Seal method
gen.Emit(OpCodes.Ret);
}
这里的type就是我们刚才BuildClass的返回值;methodName是生成的业务方法名称;methodType指方法的类型(查询方法Query或非查询方法NonQuery);sqlText是SQL正文;sqlType是sqlText的类型(Text, StoredProcedure或Table);sqlParams是查询参数列表;retTypeName是返回参数类型名称(这个类型可以根据sql自动生成,将来我们可以看到);retTypeFlag可以是"Vector"或"Scalar",以指明是返回标量(单个记录)或向量(一组记录)。
到这里,我们的工具主体就定义完整了。明天我们来定义输入的xml文件,将需要用到的信息维护进去,然后由生成工具读取,生成DAL类(DLL)文件。