您的位置:首页 > 编程语言 > Qt开发

使用LinqToSql加载动态column

2011-01-19 16:08 525 查看
需求

最近有个小的探索类需求:如何支持在数据库中动态的添加一列?

例如我们有一个type News

wrap        private Type Wrap()
{
var wrapper = new ContentEntityWrapper<TEntity>
{
EntityPropertyRepository = EntityPropertyRepository
};
var wrappedType = wrapper.Wrap(CurrentType);
EntityFactory.TypeInitializers[typeof(TEntity)] = () => Activator.CreateInstance(wrappedType) as IEntity;
return wrappedType;
}


动态类型生成

本例中采用了两种动态生成类型的方式。

News –> XXXNews这个过程使用了Emit

News –> WrappedNews这个过程使用了codeDom

关于前者,有一点需要说明:

由于XXXNews以后还需要进一步包装为WrappedXXXNews,所以Emit出来的Assembly需要Save到硬盘。存在什么位置呢?我曾经使用了缺省值(Environment.CurrentDirectory),但是XXXNews –> WrappedXXXNews时报告说找不到Emit出来的Assembly(这个异常好隐蔽。。。花了我很久。。。)。于是我尝试Save到bin目录下。但是对bin目录内容的更改又会造成ASP.NET的重编译(听说。具体发生了什么求赐教),于是存到了bin2。。。我也知道这是个很雷的方案。。。在web.config中设置

<probing privatePath="bin;bin2"/>
就可以了。

关于后者,我使用了Expressions to CodeDOM,使用过程实在算不上顺手。。。求推荐更好的codedom类库。

Controller的依赖注入

园子里的刘东大人(spring.net达人)已经介绍过了使用spring.net 1.3.1对controller的注入。

我在这里说两个问题

好像还是要依赖Spring.Core的,估计刘东大把这个assembly加入了GAC?
还是不知道怎么兑Global.asax进行注入。目前只会比较丑陋的写法
ContextRegistry.GetContext().GetObject("someObj"),而且只能在Application_Start之后使用

接下来的路

本例中还有很多未尽事宜,例如

LambdaExpressionBinder没有完成,所以create一个list view的时候无法把用户输入的lambda表达式转为Func。这个相信用codedom也能做,只是我实在懒得弄了。

还没有实现允许用户输入ExpireAt,也懒得弄了。。。

Wrap content entity type的时候,本来应该读取对应的property,加上相应的column参数的,懒得弄了。。。

还有很多基本的地方,例如NewsProperty、NewsListView根本都没有mapping到数据库。。。。。。懒得弄了。。。

等等等等

你有多懒啊!喂!

不过有些地方不是我懒哦

比如不知道Spring.Net的ControllerFactory是怎么实现的(以后抽个时间看看),我必须要写以下三个Controller,直接在配置文件中指定泛型Controller不行。以后直接上Mvc3试试好了。

NewsPropertyController
NewsListViewController
NewsController


虽然如上所述,本例还有非常多的不足,不过我不会再更新了(这不是坑。。。

本来就是个技术学习性质的东西,实际应用可能性很小(比如现在大家都不会用Linq to Sql了吧)。我也真的在这个过程中学到了不少东西,这对我就足够了。

代码下载与声明

本例使用Spring.Net实现IoC和singleton

本例使用了Expressions to CodeDOM实现codedom

本例中的TypeBinder基本照抄自《Pro ASP.NET MVC 2 Framework 2nd Edition》中的实现

运行本例前请自备数据库结构如下(就一个表)





并自行修改web.config中的连接串

按F5 首先出现news list





然后请进news properties





之后Add我们需要的ExpireAt





Save成功后再次进入news,这个list不会变化,尝试进入view,就会看到ExpireAt了





最后给出本例下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: