Magicodes.NET框架
首先感谢大家对Magicodes.NET框架的支持。就如我上篇所说,框架成熟可能至少还需要一年,毕竟个人力量实在有限。希望有兴趣的小伙伴能够加入我们并且给予贡献。同时有问题的小伙伴请不要在群里询问问题,QQ群仅限于技术交流。
所有有关Magicodes.NET的问题,请在此https://github.com/magicodes/Magicodes.NET/issues页面根据类型提交相应Issues。在使用Magicodes.NET之前,请先查看官方文档并且阅读FAQ(点此阅读)。
上篇提到了T4代码生成,随着生成的深入,我愈发觉得这种生成模式存在问题:
- 太过依赖前端脚本(增删改查都在同一个页面处理,后台控制器只是返回View)
- 不便于更换页面主题(前端太重)
- View对服务器端代码支持不够好(因为基本上都是依赖前端JS绑定的)。
- 不便于扩展或者扩展起来比较麻烦。比如新增和编辑时,下拉框的绑定,复选框组的绑定(当然这些都有解决办法),都需要编写大量通用的脚本。随着数据模型的复杂,这种方式维护会越来越麻烦。
基于以上原因,本人决定放弃此模式,开始新的T4模板生成研究之旅。
很多时候,只有重新再来,才能站得更高。所以我说框架成熟可能至少还得一年,因为我还在不断的尝试和学习。也希望小伙伴们能够多多支持,大牛们能够多多指导。
在研究的时候,我将目光定格到了ASP.NET Scaffolding上……
ASP.NET Scaffolding Template(ASP.NET基架模板)
ASP.NET Scaffolding。可能很多小伙伴们没听说过,但是其实你已经在用它呢。这玩意儿是微软的一个工程师编写的,然后集成到了VS2013中。这是个什么玩意儿呢?看看下面的图你可能就想起来了。
添加控制器的时候:
然后选择模型类,DbContext等:
点击添加后,你就会发现他干了很多碉堡了的事:
控制器和增删改查都生成好了!!!
我们来看看生成的控制器代码:
增删改查一应俱全,而且还考虑到了安全性。同样的,相关视图也生成好了,能够展示简单的列表以及增删改。
具体请看:http://www.asp.net/visual-studio/overview/2013/aspnet-scaffolding-overview
我们来看看生成的原始界面:
虽然灰不溜秋,但是不失为一种很强大的方式。好像瞬间把代码生成拉高了几个档次,个人觉得这种方式相当不错。给我的第一感觉是,妈的,好高大上啊,老子要自定义。
自定义ASP.NET MVC基架
关于ASP.NET MVC基架的资料国内还比较欠缺,FQ研究了一会,也有一点成效:
是不是瞬间又高大上了很多?人靠衣裳啊,别介意,这个还不够美。只是粗浅的。想想,如果能够根据控件类型生成相应JS控件,再加点逻辑控制,那就完美了!!
废话不说,我们先来看看怎么自定义这玩意儿。
第一步,安装SideWaffle:
可以在这个网址下载:http://sidewaffle.com/
第二步,选择ASP.NET基架T4文件:
然后,你就会发现项目工程里多了一个CodeTemplates目录,里面有很多T4文件:
这就是MVC基架T4模板(包括WebAPI等等),然后我们就可以Happy的定制了,只是目前是:
比如编辑模板,我们可以加点样式点缀点缀:
于是就成了上面的样子。
刚Happy不久,然后发现问题来了!!!
ASP.NET MVC基架模板的问题
比如在List.cs.t4模板里,我需要获取模型类的类特性,方便干点坏事。比如获取列表标题啊等等,然后我发现我杯具了。先来看看模板参数(在文件Imports.include.t4中):
<#@ parameter type="System.String" name="ViewDataTypeName" #>
<#@ parameter type="System.String" name="ViewDataTypeShortName" #>
<#@ parameter type="System.Boolean" name="IsPartialView" #>
<#@ parameter type="System.Boolean" name="IsLayoutPageSelected" #>
<#@ parameter type="System.Boolean" name="ReferenceScriptLibraries" #>
<#@ parameter type="System.Boolean" name="IsBundleConfigPresent" #>
<#@ parameter type="System.String" name="ViewName" #>
<#@ parameter type="System.String" name="LayoutPageFile" #>
<#@ parameter type="System.String" name="JQueryVersion" #>
<#@ parameter type="Microsoft.AspNet.Scaffolding.Core.Metadata.ModelMetadata" name="ModelMetadata" #>
从参数不难看出,我们能够用的就是这些了。默哀一会。然后我们发现微软那哥们给我们打开了一扇窗子,自己却被门夹了脑袋。我们唯一可以寄托希望的参数在类型:Microsoft.AspNet.Scaffolding.Core.Metadata.ModelMetadata
咦,这玩意儿咋这么眼熟,咋一看跟MVC的ModelMetadata还有EF的ModelMetadata有点像。但其实差的有点远。
就给我这么点东西,模型类型都拿不到,你让我咋玩!!!同样的属性也是拿不到类型的,妈蛋,让我白高兴了一把。微软那哥们,哥知道参数T4模板不好写,参数传过来还经过了序列化,不大好传递类型,不然反序列化会有问题,但是你丫的也想想办法呀,都是你家东西,你就搭了一个宏伟的架子,然后就没了,让哥情何以堪!!果然只是基架。为此,哥还在stackoverflow上用蹩脚的英语提了一个问题:
这是博客园的飞机票:http://q.cnblogs.com/q/69370/
好吧,为了便于T4模板参数传递,微软那哥们是将ViewModel的属性处理好然后通过参数传递过来的,T4模板参数用到了序列化和反序列化,如果传递模型类型,就得把相关dll丢GAC里面,于是就成现在这样了。自然,理论上应该是无解,于是无奈放弃。
尾声
看来伟大的想法行不通啊,看来还是自己老老实实重新写过吧。目前控制器这块的T4生成已经重构了,准备开始重新编写View的T4模板了。开启全新模式,我将在下篇介绍新的T4模板生成。
╮(╯▽╰)╭,蛋疼。
Magicodes.NET框架的更多相关文章
- Magicodes.NET框架之路——V0.0.0.5 Beta版发布
最近写代码的时间实在不多,而且今年又打算业余学习下Unity3D以及NodeJs(用于开发游戏后台),因此完善框架的时间更不多了.不过我会一直坚持下去的,同时我也希望有兴趣的同学可以加入Push你的代 ...
- Magicodes.NET框架之路——让代码再飞一会(ASP.NET Scaffolding)
首先感谢大家对Magicodes.NET框架的支持.就如我上篇所说,框架成熟可能至少还需要一年,毕竟个人力量实在有限.希望有兴趣的小伙伴能够加入我们并且给予贡献.同时有问题的小伙伴请不要在群里询问问题 ...
- 3.Magicodes.NET框架之路——预览(一)
3.Magicodes.NET框架之路——预览(一) 前言 一眨眼,已经过去两个多月了 ,哥已经火力全开了(业余时间和精力,甚至为此放弃了各种私活),所以大家不要抱怨慢哈.编程犹如逆水行舟,不进则退. ...
- 1.Magicodes.NET框架之路——起航
1.Magicodes.NET框架之路--起航 前言 从事开发也好几年了,并且最近一直在做架构搭建的工作.这些时间,最大的感悟就是: 只有自己理解了的才是自己的. 对架构这块,若欲立之,必先破之. 故 ...
- Magicodes.NET框架之路——产品之路(谈谈产品管理)
虽然Magicodes.NET现在还不属于产品,但是却不妨碍她想成为产品的心. 为什么突然有了此篇,这篇不是空穴来风,而是我思考良久的结果: 为了让大家知道我在干什么,我想干什么,我将要干什么还有我干 ...
- Magicodes.NET框架之路——让Magicodes.NET帮你编写代码
时间总是过得很快,而我几乎没有时间来安安静静的写博客和完善文档.不过总算是框架在一直前进,而我的计划是在今年年底(公历)前,让此框架成熟稳定. 在很长一段时间里,我尝试了很多我之前没有接触的技术或者没 ...
- 2.Magicodes.NET框架之路——策略管理
闲话策略 策略,有很多解释.但鄙人个人比较看重这点: 策略,是为了实现某个目标或者针对某些问题而制定的应对方案,以最终实现目标.比如为实现生娃而XXOO. 因此在本框架中,策略(Strategy),则 ...
- Magicodes.NET框架之路[转]
插件式框架 响应式布局以及前后端对移动设备的支持 便捷的业务代码生成,比如CRUD生成,并且表单支持根据不同数据类型或特性生成相应的展示组件. 从框架到插件包括代码生成模板均走开源路线,便于理解和定制 ...
- Magicodes.WeiChat——版本发布历史
购买地址:https://item.taobao.com/item.htm?id=520205558575 您可以在新标签页打开此图,以查看原始图片. Magicodes.WeiChat为湖南心莱信息 ...
随机推荐
- 阿里2015在线研发project师笔试题(部分)
今天lz去阿里的在线笔试打了一把酱油,因为lz的水平有限,时间太他么紧张了.以下把记下来的题给大家分享一下.选择题总共20道,前十题截了图,后面感觉太费时就没有再截了,凭记忆记下了两道.附加题都记录下 ...
- SQLServer RESOURCE_SEMAPHORE 等待状态
原文:SQLServer RESOURCE_SEMAPHORE 等待状态 概述: 当一个SQLServer实例运行得很慢的时候,应该做一些检查,如检查等待状态.最好的方法是一开始就建立一个性能基线,以 ...
- Oracle中merge into的使用 (转)
http://blog.csdn.net/yuzhic/article/details/1896878 http://blog.csdn.net/macle2010/article/details/5 ...
- Afinal载入网络图片及下载文件用法
Afinal高速开发框架使用起来很方便.以下将解说怎样利用Afinal载入网络图片及下载文件: 先看效果图: 注意:使用Afinal前需加入Afinal的jar,能够在这里下载:http://down ...
- poj 2689 巧妙地运用素数筛选
称号: 给出一个区间[L,R]求在该区间内的素数最短,最长距离. (R < 2 * 10^9 , R - L <= 10 ^ 6) 由数论知识可得一个数的因子可在开根号内得到. 所以,我们 ...
- 推荐几个我一直在使用chrome小工具(上)
我用的chrome插件挺多的,所谓工欲善其事必先利其器,我热衷于搜寻好用的工具来让我平时的工作事半功倍. 以下介绍几款我正在用的感觉还不错的插件,假设大家还有其他好用的(肯定有,chrome插件库太庞 ...
- 使用exchange普通表模式被切换到分区表
随着数据库的不断增长的数据量.有些表需要转换的普通堆表分区表模式. 有几种不同的方式来执行此操作,如出口数据表,区表再导入数据到分区表:使用EXCHANGE PARTITION方式来转换为分区表以及使 ...
- iOS 生成随机颜色(UIColor)
#import <UIKit/UIKit.h> @interface UIColor (RandomColor) +(UIColor *) randomColor; @end #impor ...
- 对“demo!demo.Index+HookProc::Invoke”垃圾收集的类型已委托回调。这可能会导致应用程序崩溃、损坏和数据丢失。当传递委托给非托管代码,托管应用程序必须让这些委托保持活着
对"demo!demo.Index+HookProc::Invoke"垃圾收集的类型已委托回调.这可能会导致应用程序崩溃.损坏和数据丢失.当传递委托给非托管代码,托管应用程序必须承 ...
- 【Hibernate步步为营】--复合主键映射具体解释
上篇文章讨论了继承映射,它是对象模型中最主要的特性,对于继承映射它的主要区分是字段类型的不同,所以在生成表结构时须要有新列来标识数据的类型,能够使用<subclass>标签并在标签中加入d ...