BlogMax项目进展

生活工作思考BBSMAXBLOGMAX by 达达 at 2008-01-12

已经很久没有更新Blog了,没有再发什么好玩的东西了,真是对不起关注我的朋友们。不过很快就会有另一个好玩的东西和大家见面,那就是我先前说要开发的Blog。

最近除了对着电脑累了不想写代码的时候玩会PSP,几乎所有时间一天十几个小时对着电脑连轴转。还好我体力不错,呵呵。最近其实做了很多事情,我自己其实都有点吓到。 程序方面把我先前设想要做的应用框架完成了几个主要部分包括以下几个项目:

  • MaxLab.Common.Data -- 对ADO.NET的封装,基本上每个.NET开发人员自己都会有一个这样的东西,这个项目的代码其实是我差不多一年前做的,一直沿用至今,只是增强了配置性和扩展性,并加了个SQLite数据库的驱动
  • MaxLab.Common.DataAccess -- 用于简化数据层的开发,节省大量劳动力,Blog项目上用了下,到目前位置功能和灵活性还算满意,不过还有很多地方需要加强
  • MaxLab.Common.ORM -- 自己开发的一个简易的对象关系映射的组件,目前只是用于简化实体类的重复编码,以后会实现一套基于对象关系的查询机制,这个查询机制我运量了很久了,一直都没有一个比较满意的方式,所以都没有下手做。目前有了DataAccess项目,也将数据库操作简化了非常多,所以对象关系查询的实现变得不是那么必要,但是实现对象关系查询还是可以大量提示开发效率的
  • MaxLab.Common.ObjectFactory -- 对象工厂,DataAccess项目和ORM项目都需要用到动态创建类型和对象,所以我把这部分功能抽象出来,独立为对象工厂。对象工厂本身并不执行创建操作,它会调用配置的类型提供器去创建对象类型,再去创建具体类型的对象。这样使得对象的整个创建过程都掌握在我们手中,想要动态创建代理类型实现AOP或者想要动态注入依赖关系实现IOC都是可以的。这个对象工厂也还是雏形,以后继续加强相信会非常棒
  • MaxLab.Common.MVC -- 因为Blog项目的需要,本来是开发一套模板机制的,后来做着做着就成了个模板引擎,后来发现连表单自动处理都可以实现,那干脆独立出来,暂且叫做MVC组件吧,虽然感觉和MVC有点像又有点不像。这个模板引擎现在看来还是蛮不错的,起码支持外部注册模板标签,和模板参数,以及表单处理的注册。以后Blog开发插件时也能根据自己需要注册模板标签和表单处理,呵呵

目前应用框架还缺少异常和日志处理的一个组件,但现有几个组件已经可以满足Blog第一个版本的需要了。

MaxLab.Common.DataAccess和MaxLab.Common.ORM对开发效率的提升是很明显的,比如实体类:


[Map(typeof(NamingProvider))]
public abstract class Post : EntityBase
{
    [Map(typeof(NamingProvider)), PrimaryKey]
    public abstract int? ID { get; set; }

    [Map(typeof(NamingProvider))]
    public abstract int? UserID { get; set; }

    [Map(typeof(NamingProvider))]
    public abstract int? ReadCount { get; set; }

    [Map(typeof(NamingProvider))]
    public abstract int? CommentCount { get; set; }

    [Map(typeof(NamingProvider))]
    public abstract Statues? Status { get; set; }

    [Map(typeof(NamingProvider))]
    public abstract string Title { get; set; }

    [Map(typeof(NamingProvider))]
    public abstract string Password { get; set; }

    [Map(typeof(NamingProvider))]
    public abstract DateTime? CreatedOn { get; set; }

    [Map(typeof(NamingProvider))]
    public abstract DateTime? UpdatedOn { get; set; }


    [BelongsTo(typeof(NamingProvider))]
    public abstract User User { get; set; }

    [HasManyAndBelongsTo(typeof(NamingProvider), RelationTable = RelationTables.PostCategotry)]
    public abstract IList Categories { get; set; }


    [Map(typeof(NamingProvider)), Extend]
    public abstract string Content { get; set; }


    public enum Statues { Draf, Public, Private, Protected }
}

我只需要写一个抽象类,内部代码ORM组件会帮我写。另外通过NamingProvider来提供整个项目的命名规则管理,保持ORM组件的最大灵活度。对象关系上借鉴了Ruby上的ActiveRecord项目的概念。不过目前这些BelongTo,HasMangyAndBelongsTo关系等还都只是用于通过实体类反向生成数据库,呵呵。以后做对象关系查询也会用到的。

数据层我只需要这样写(节省篇幅,只放一个方法):

public abstract class PostDAO : DAO
{
        [Query("SELECT COUNT(ID) FROM Posts WHERE UserID=@UserID")]
        public abstract long GetUserPostCount(int @UserID);

        [Query("SELECT * FROM Posts WHERE UserID=@UserID ORDER BY CreatedOn ASC LIMIT @Limit OFFSET @Offset")]
        public abstract List GetUserPosts_ASC(int @UserID, int @Limit, int @Offset);
}

一样只需要抽象类,我不用写什么ADO.NET的ExecuteXXX方法也不用自己写很长的代码来通过DataReader或者DataSet创建实体对象 :D

很节省代码吧,哈哈。

对了创建Post对象和PostDAO需要通过对象工厂:

Post post = Factory<Post>.Create();

PostDAO dao = Factory<PostDAO>.Create();

PostDAO的代码其实我稍微做了点简化,其实我增加了一层IxxxDAO接口来隔离具体的DAO类型的创建,保持项目兼容多种数据库版本的可能。

说起来其实比做起来难,其实这几个组件内部的性能优化和扩展性设置有很多的技巧再里面,以后我会陆续写继续的描述文章。

嘿嘿,很快一个外部很简陋但是内部很高档的Blog就可以和大家见面了,敬请期待吧。。。