fastCSharp代码生成器发布

showjim 2012-12-04 02:34:21
由于两个ACM题花了差不多两个星期的时间,拖延了代码生成器的发布(下载)。
不过通过这段时间的折腾,对于C#细节优化有了更多的了解。知道了结构体数组元素赋值写个Set函数比=new要好,知道了静态字段的访问和引用成员字段访问一样低效(相对于堆栈访问),知道了临时变量的数量必须要自己控制(C#编译器的寄存器优化并不智能),知道了小函数内联是靠不住的,更加的重视非安全数组元素的访问次数了...

还是回到正题,上个月准备讨论一下代码生成器重新实现的问题,没有什么反馈,所以还是按照我以前的方案重写代码。我简单的说一下方案实现的原理与过程。
1、在需要代码生成功能的项目属性的后期生成事件中执行命令调用带参的fastCSharp.exe,代码生成器是基于.net元数据的,所以需要程序集相关信息:
if exist D:\fastCSharp\bin\Release\fastCSharp.exe D:\fastCSharp\bin\Release\fastCSharp.exe $(ProjectName) $(ProjectDir) $(TargetPath) $(TargetName)

ProjectName 是项目名称,预留字段
ProjectDir 是项目路径,用于查找或读写.cs程序文件
TargetPath 是程序集完整文件名,用于读取.NET元数据信息
TargetName 默认命名空间,用于生成目标文件命名,比如TargetName=fastCSharp,那么生成的代码文件名为fastCSharp.cSharper.cs
2、fastCSharp.exe找到所有继承自fastCSharp.setup.IAuto的类,读取其自定义属性配置fastCSharp.setup.auto,按照依赖关系fastCSharp.setup.auto.DependType拓扑排序,然后依次使用反射调用fastCSharp.setup.IAuto.Run。
                    list<keyValue<Type, setup.auto>> autos = setup.ui.CurrentAssembly.GetTypes()
.getFind(type => !type.IsInterface && !type.IsAbstract && type.isInterface(typeof(setup.IAuto)))
.getArray(type => new keyValue<Type, setup.auto>(type, type.customAttribute<setup.auto>(false)))
.getFind(value => value.Value != null && value.Value.IsSetup && value.Value.IsAuto);
setup.ui.Setup(autos, parameter, false);

当前版本的fastCSharp.exe有4个继承自fastCSharp.setup.IAuto的类:
fastCSharp.setup.cSharp.coder.cSharp是C#代码生成器的核心,它读取并解析所有程序模板并生成中间代码fastCSharp.cSharper.cs,fastCSharp.cSharper.cs就是一个字符串拼接程序。
                        string[] codes = parameter.Types.getArray(type => new definition { Type = type, Auto = type.customAttribute<auto>(false) })
.getFind(type => type.Auto != null && type.Auto.IsSetup && type.Auto.DependType == typeof(cSharper))
.getArray(type => type.ToString());

fastCSharp.setup.cSharp.ajax.cSharp是一个JSON处理代码生成实例的数据视图,其配套的程序模板是fastCSharp.setup.cSharp.template.ajax,自定义属性配置是fastCSharp.setup.cSharp.ajax。
fastCSharp.setup.cSharp.simpleTemplate是一个简单的自定义模板解析程序(与.NET元数据无关),比如template目录下的程序模板。
fastCSharp.setup.test用于简单的编译时单元测试。
3、代码生成实例的运行,比如fastCSharp.setup.cSharp.ajax.cSharp,它继承自fastCSharp.setup.IAuto,所以会被fastCSharp.exe默认调用。它会读取程序集TargetPath的元数据信息,获取所有标记自定义属性[fastCSharp.setup.cSharp.ajax]的类,读取其字段与属性信息生成最终的目标程序。
                    keyValue<Type, ajax>[] ajaxs = parameter.Types
.getArray(type => new keyValue<Type, ajax>(type, type.customAttribute<ajax>(false)))
.getFindArray(ajax => ajax.Value != null && ajax.Value.IsSetup);
foreach (keyValue<Type, ajax> ajax in ajaxs)
{
type = ajax.Key;
Attribute = ajax.Value;
UnknownToJsonType = ajax.Value.UnknownToJson != null && ajax.Value.UnknownToJson.isInterface(typeof(IUnknownToJson)) ? (memberType)ajax.Value.UnknownToJson : null;
UnknownParseJsonType = ajax.Value.UnknownParseJson != null && ajax.Value.UnknownParseJson.isInterface(typeof(IUnknownParseJson)) ? (memberType)ajax.Value.UnknownParseJson : null;
Members = setup.memberInfo.GetMembers<ajax>(ajax.Key, setup.memberInfo.filter.PublicInstance, false, true);
if (Attribute.IsToJson) memberMap.create(ajax.Key);
if (Attribute.IsParseJson && !ajax.Key.isNull()) copy.create(ajax.Key);
create(true);
}


写一个代码生成器实例有3个部分:
1、自定义属性,必须继承自fastCSharp.setup.ignore,比如fastCSharp.setup.cSharp.ajax,用于配置描述。不需要描述的也必须要定义一个空壳,用于识别代码生成类型。
2、数据视图,必须继承自fastCSharp.setup.cSharp.cSharper用于表示该实例,可选继承自fastCSharp.setup.IAuto用于编译时自动调用。比如fastCSharp.setup.cSharp.ajax.cSharp的主要数据成员是Members。
3、程序模板,比如fastCSharp.setup.cSharp.template.ajax,现在支持11种标识fastCSharp.setup.template.command,与旧版本的标识稍有不同。
...全文
495 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
事理 2012-12-05
  • 打赏
  • 举报
回复
lz辛苦,谢谢分享。
随着云计算快速发展和SaaS模式普及,多租户架构共享基础设施为多个租户提供服务,但数据存储在同一数据库,隔离机制不完善将导致跨租户数据泄露。据云安全联盟统计,数据隔离失效是SaaS应用面临的首要安全风险。针对现有多租户系统在隔离粒度、控制灵活性和策略可定制性方面的不足,本文提出细粒度数据隔离与精细化访问控制方案,基于Java+Spring Boot+MyBatis-Plus+MySQL实现,含租户管理、数据隔离、权限配置、访问控制、安全审计五个核心模块。核心创新有三方面:其一,TENANT-ROW-ISOLATION行级数据强制隔离机制,设计ORM拦截器层与数据库视图层双重隔离架构,ORM层自动注入租户条件防止遗漏,数据库层通过租户视图和行级安全策略实现强制隔离,并支持AES-256加密存储和动态数据脱敏;其二,RBAC-ABAC-HYBRID混合访问控制模型,以RBAC实现粗粒度权限管理,以ABAC实现基于用户属性、资源属性、环境属性的细粒度动态授权,支持权限继承、职责分离和临时授权;其三,DYNAMIC-POLICY动态安全策略引擎,支持租户自定义访问控制、数据脱敏和审批规则,实时生效,支持优先级、冲突检测、版本管理和决策缓存。实验表明,数据隔离有效性达100%,越权访问拦截率99.2%,认证授权平均延迟2.3ms,隔离查询开销小于5%,策略评估延迟1.8ms,系统在隔离粒度、控制灵活性和策略可定制性方面较传统方案优势显著,为SaaS多租户应用提供了有效的数据安全防护方案。 【课程报告内容】 摘要 第1章 绪论 第2章 相关技术与理论 第3章 系统需求分析 第4章 系统总体设计 第5章 系统详细设计与实现 第6章 系统测试与分析 第7章 总结与展望 参考文献 附件-实现指南

13,345

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET技术前瞻
社区管理员
  • .NET技术前瞻社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧