环境支持及其他接口


一、环境支持类

  在扩展文件里可以使用 IDevHosting 接口来提供一些额外的操作。

成员 说明
ConsoleInfo 方法 在【输出窗口】中输出一般信息
ConsoleError 方法 在【输出窗口】中输出错误信息
ShowInfo 方法 弹出信息提示框
ShowError 方法 弹出错误提示框
GetTables 方法 获取需要生成的表集合。返回 IEnumerable<Table> 类型
Template 属性 获取当前使用的模板定义,此属性是 TemplateDefinition 类型
Profile 属性 获取当前的变量信息
Funcs 属性 获取函数集3.4,可在【选项】-【插件】窗口中查看

  IDevHosting 一般用在变量初始化器和架构初始化器中,只需要定义一个 IDevHosting 的属性即可。如下所示:

[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;
        
        //略去处理
        
        Hosting.ConsoleInfo(tableName);
        Hosting.ConsoleError(table.ClassName);
    }
}

  在读入数据源后,会在【输出窗口】输出如下信息:


  在注入 IDevHosting 对象时,会自动触发 OnAttachHosting3.4 方法的调用(如果代码中定义了该方法),如下所示:

[SchemaExtension(typeof(Table))]
public class TableDMSExt
{
    [Description("是否DMS表。")]
    public bool IsDMS { get; set; } 
}

[SchemaInitializer(typeof(Table))]
public class DMSNameInitializer : ISchemaInitializer
{
    private string[] dms_tables = null;
    
    public IDevHosting Hosting { get; set; }
    
    private void OnAttachHosting()
    {
        dms_tables = (string[])Hosting.Funcs.ReadStrings("dms.txt");
    }
    
    public void Initialize(dynamic profile, dynamic schema)
    {
        var table = schema as Table;
        schema.IsDMS = dms_tables.Contains(table.Name);
    }
}

  上面的代码中,向 Table 扩展了一个 IsDMS 属性,同时在初始化器首次构造时从外部读取一个文本文件,用于标注该表的 DMS 属性。OnAttachHosting 方法只会触发一次,所以保证了程序的性能。


二、部件输出解析器

  生成代码后,你可以对输出的路径进行调整,此时你需要定义一个 IPartitionOutputParser 接口的实现类,可放在 extensionsprofileextensionsschema 目录中的任意一个类文件内。此接口的定义如下:

namespace CodeBuilder.Core.Template
{
    /// <summary>
    /// 部件输出路径的解析器。
    /// </summary>
    public interface IPartitionOutputParser
    {
        void Parse(OutputParseContext context);
    }

  比如 Fireasy for Mvc+Service 完整项目(.net core3.1) 模板就定义了一个解析类,它的作用是当没有指定 Module 变量值时,把输出路径中的 Areas 去掉。

//当没有指定 Module 时,将文件路径中的Areas移走
public class AreaOutputProcessor : IPartitionOutputParser
{
    public void Parse(OutputParseContext context)
    {
        if (string.IsNullOrEmpty(context.Profile.Module) && context.Result.IndexOf("Areas\\") != -1)
        {
            context.Result = context.Result.Replace("Areas\\", string.Empty);
        }
    }
}

  OutputParseContext 类包含以下几个属性:

名称 说明
Schema 根据部件所定义 Loop 不同,可以是架构中的任意一种类型。dynamic 类型。
Profile 变量对象。dynamic 类型。
Result 文件输出的路径。