fastCSharp 代码生成的底层应用框架开源项目

我要开发同款
匿名用户2013年05月29日
44阅读
开发技术C#
所属分类其他开发相关、程序开发
授权协议BSD

作品详情

fastCSharp是一个基于.NET元数据的代码生成的底层应用框架,目标是打造一个“开发+运行”效率双优的开源框架。经过半年多的时间,除了与web开发直接相关的部分,都已经在fastCSharppart1.5中完成了重写工作。fastCSharp现在实现的代码生成实例主要有5个:1、基于缓存查询模式的ORM代码生成实例(现在只支持MSSQL),自定义配置类是fastCSharp.setup.cSharp.sqlTable,同时支持反射模式fastCSharp.setup.cSharp.sqlTable.sqlTool。下面是ORM的model定义示例12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849    [fastCSharp.setup.cSharp.sqlTable(ConnectionName = "Connection1")]    public partial class model1    {        ///         /// 自增列,一个表格只允许一个,如果不配置IsIdentity = true,将自动匹配名称为 id 的成员        ///         [fastCSharp.setup.sqlMember(IsIdentity = true)]        public int id;         ///         /// 关键字1,多个关键字成员按照成员定义顺序一致        ///         [fastCSharp.setup.sqlMember(IsPrimaryKey = true)]        public int key1;        ///         /// 关键字2        ///         [fastCSharp.setup.sqlMember(IsPrimaryKey = true, IsAscii = true, MaxLength = 32)]         public string key2;        public enum EnumByte : byte        {             Enum1        }        ///         /// 直接支持枚举类型转换,可以不指定SqlType = typeof(byte)        ///         [fastCSharp.setup.sqlMember(SqlType = typeof(byte))]        public EnumByte key2;         ///         /// 指定隐式类型转换        ///         [fastCSharp.setup.sqlMember(SqlType = typeof(string))]        public partial struct image        {            public string url;            ///             /// 如果不能隐式类型转换,必须实现互转函数            ///             public static implicit operator image(string url) { return new image { url = url }; }            public static implicit operator string(image image) { return image.url; }        }        ///         /// 支持隐式类型转换        ///         [fastCSharp.setup.sqlMember(IsAscii = true, MaxLength = 64)]        public image icon = string.Empty;    } fastCSharp的配置文件是一个纯数据的json格式文件,比如Connection1的配置定义123456789101112{sql:   {    checkConnection:["Connection1"],    Connection1:        {        Diantou:{            Type:"sql2008",            Connection:"server=192.168.0.100;database=dbname;uid=username;pwd=password"            }        }    }} 下面是代码生成模式示例,采用派生类的模式1234567891011121314    public partial class bModel1 : model1.sqlTable    {        static bModel1()        {            if (SqlTool != null)            {                //定义缓存                Cache = new fastCSharp.sql.cache.whole.identityArray(SqlTool);                //定义缓存同步个性化处理事件                Cache.OnInserted += XXX;                Cache.OnUpdated += XXX;            }        }    } 有时候多个表格结构相同,那么只需要定义一个model,比如可以12345678910    public abstract class bModelBase : model1.sqlTable        where tableType : bModelBase    {    }    public partial class bModel1_1 : bModelBase    {    }    public partial class bModel1_N : bModelBase    {    } 下面是反射模式示例1234567891011    public class bModel1 : model1    {        private static readonly fastCSharp.setup.cSharp.sqlTable.sqlTool sqlTool = fastCSharp.setup.cSharp.sqlTable.sqlTool.Default;        static bModel1()        {            if (sqlTool != null)            {                //缓存定义与事件定义 和 代码生成模式示例一样            }        }       } 有人说ORM不适应于复杂的综合查询。真的吗?我现在展示一段查询代码12345678910111213141516                return diantou.dataProxy.questionTopic.getTopicCache(id)                    .getArray(value => diantou.dataProxy.question.get(value.linkId))                    .getHash(value => value.bestAnswerId)                    .getArray(value => diantou.dataProxy.answer.get(value))                    .getFind(value => value != null)                    .group(value => value.userId)                    .getArray(value => new keyValue(diantou.dataProxy.user.get(value.Key), value.Value.Count))                    .group(value => value.Key.grade0)                    .getArray(value => new userStat                    {                        grade0 = value.Key,                        count = value.Value.Count,                        path = topic.path.bestAnswer,                        users = value.Value.rangeSort((left, right) => right.Value - left.Value, 0, 6)                            .getArray(user => diantou.dataProxy.user.get(user.Key, userId))                    }); 这个查询需求是,先根据话题(topic)ID查找相关联的问题(question)ID集合,然后找到这些问题的最佳答案(answer)ID集合,然后根据这些答案的用户(user)ID分组统计答案数量,最后将这些用户根据用户等级分组,每个分组根据答案数量取前6个用户。我个人认为基于ORM的查询更简单流畅。如果用SQL实现这个需求,该是一个多么复杂的SQL语句?如果需求有一点点变化,修改这个SQL语句该是多麻烦的事?2、数据类快速序列化代码生成实例,自定义配置类是fastCSharp.setup.cSharp.serialize,同时支持反射模式。1234567    ///     /// 仅仅选择字段成员,反射模式可以不必配置    ///     [fastCSharp.setup.cSharp.serialize(Filter = fastCSharp.setup.memberFilter.InstanceField)]    public partial class model1    {    } 代码生成模式将实现接口fastCSharp.setup.cSharp.serialize.ISerialize123456789
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论