架构扩展


一、定义扩展类

  在 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 进行扩展,如 TableColumn


  属性上可使用以下特性进行标注:

  • 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 进行初始化,如 TableColumn

  schema 的定义详见 使用数据源 - 附

  可以在配置文件 configassemblies.cfg 的 Schema 属性里增加程序集。