架构扩展
一、定义扩展类
在 schema 目录下,添加类文件,编写代码(示例使用 C# 编写)如下:
using System.ComponentModel;
using CodeBuilder.Core.Source;
using CodeBuilder.Core.Template;
using CodeBuilder.Core.Initializers;
[SchemaExtension(typeof(Table))]
public class ColumnExtForTree
{
[Description("是否树型结构。默认使用 Code 作为编码。")]
public bool IsTree { get; set; }
}
[SchemaExtension(typeof(Column))]
public class ColumnExtForEasyUI
{
[Category("EasyUI")]
[Description("EasyUI控件类别。")]
public EasyUIFieldType ControlType { get; set; }
[Category("EasyUI")]
[Description("是否生成域。")]
[DefaultValue(true)]
public bool GenerateField { get; set; }
}
public enum EasyUIFieldType
{
TextBox,
NumberBox,
ComboBox,
ComboTree,
DateBox,
DateTimeBox,
}
SchemaExtensionAttribute
用来标注该类对何种 schema 进行扩展,如 Table
、Column
。
属性上可使用以下特性进行标注:
DescriptionAttribute
在属性上进行标注,可在【属性窗口】里看到此注释。
DefaultValueAttribute
默认值,在【属性窗口】中默认填入。如:
[DefaultValue(true)]
public bool GenerateField { get; set; }
CategoryAttribute
对变量进行分组。如:
[Category("EasyUI")]
public bool GenerateField { get; set; }
DisplayNameAttribute
标注在【属性窗口】里显示的名称。
二、架构初始化
实现架构初始化器 ISchemaInitializer
可以对架构进行加工。此接口的定义如下:
namespace CodeBuilder.Core.Initializers
{
/// <summary>
/// 提供对架构信息进行初始化的接口。
/// </summary>
public interface ISchemaInitializer
{
void Initialize(dynamic profile, dynamic schema);
}
}
数据表 ClassName
和字段的 PropertyName
的命名,以及 PropertyType
就是通过架构初始化器来完成转换的,它在 schemaase.cs
类文件中。代码如下:
// 用于格式化类名
[SchemaInitializer(typeof(Table))]
public class ClassNameInitializer : ISchemaInitializer
{
public IDevHosting Hosting { get; set; }
public void Initialize(dynamic profile, dynamic schema)
{
var table = schema as Table;
var tableName = table.Name;
// 正则替换前缀
if (!string.IsNullOrEmpty(profile.TableRegex))
{
var regx = new Regex(profile.TableRegex);
if (regx.IsMatch(tableName))
{
tableName = regx.Replace(tableName, string.Empty);
}
}
// Pascal 命名
if (profile.TableNamingMode == NamingMode.Pascal)
{
table.ClassName = SchemaHelper.PascalFormat(tableName);
}
else
{
table.ClassName = tableName;
}
Hosting.ConsoleInfo(tableName);
Hosting.ConsoleError(table.ClassName);
}
}
// 用于格式化属性名
[SchemaInitializer(typeof(Column))]
public class PropertyNameInitializer : ISchemaInitializer
{
public void Initialize(dynamic profile, dynamic schema)
{
var column = schema as Column;
var columnName = column.Name;
// 正则替换前缀
if (!string.IsNullOrEmpty(profile.ColumeRegex))
{
var regx = new Regex(profile.ColumeRegex);
if (regx.IsMatch(columnName))
{
columnName = regx.Replace(columnName, string.Empty);
}
}
// Pascal 命名
if (profile.ColumnNamingMode == NamingMode.Pascal)
{
column.PropertyName = SchemaHelper.PascalFormat(columnName);
}
else
{
column.PropertyName = columnName;
}
}
}
// 用于转换属性类型
[SchemaInitializer(typeof(Column))]
public class PropertyTypeInitializer : ISchemaInitializer
{
public void Initialize(dynamic profile, dynamic schema)
{
var column = schema as Column;
if (profile.Language == Language.CSharp)
{
column.PropertyType = SchemaHelper.GetCSharpType(column);
}
else if (profile.Language == Language.Java)
{
column.PropertyType = SchemaHelper.GetJavaType(column);
}
else if (profile.Language == Language.VB)
{
column.PropertyType = SchemaHelper.GetVBType(column);
}
else
{
column.PropertyType = "??";
}
}
}
// SchemaHelper 略过
💡 多说一句
架构初始化器需要使用 SchemaInitializerAttribute
标注对何种 schema 进行初始化,如 Table
、Column
。
schema 的定义详见 使用数据源 - 附。
可以在配置文件 configassemblies.cfg
的 Schema 属性里增加程序集。