posts - 165,  comments - 876,  trackbacks - 41
 

       经过一段时间的努力NClay框架终于到了可以见人的阶段了,为了让大家对NClay的了解于是基于NClay编写了一个SmallBlog程序作为介绍案例。在开发SmallBlog过程刚好VS2008beta2中文版发布,看到她的特性后发现能进行步提高NClay的开发效率,于是就用VS2008结合NClay进行SmallBlog的编写。

NClay的结构

 

SmallBlog

       SmallBlog是一个简单的个人博客程序,从SmallBlog中大家可以了解到NClayORM,MVCAOP等功能的应用,下面通过SmallBlog的代码来了解NClay的处理结果。

程序结构

 

程序主要分为三大部分

实体层SmallBlog.Entities用于各层进行数据交换的基础介体。

逻辑层:SmallBlog.Logic用于处理各种输入和输出逻辑

表现层:SmallBlog用于信息的输出和信息输入。

实体的定义

       实体的是程序和数据结构的映射描述,也是NClay.Data进行数据操作的依赖结构。

     /// <summary>

     /// DBModel.Table

     /// </summary>

     [Serializable]

     [NClay.Data.Mappings.TableMapper("Category")]

     public partial class Category

     {

         public Category ()

         {

              //

              // TODO: 在此处添加构造函数逻辑

              //

         }

         private string mCategoryID;

         /// <summary>

         /// varchar

         /// </summary>

         [NClay.Data.Mappings.PrimaryKey("CategoryID")]

         public string CategoryID

         {

              get

              {

                   return mCategoryID;

              }

              set

              {

                   mCategoryID= value;

              }

         }

业务逻辑

       NClay的原则是所有逻辑处理必须以接口的方式体现,所以在设计阶段必须构造业务输出和输的逻辑接口。

    public interface ICategoryDelete

    {

        string CategoryID

        {

            get;

            set;

        }

}

        public void Delete(ICategoryDelete logic)

        {

            if (!NClay.Common.IsEmpty(logic.CategoryID))

            {

                if ((DB.Post.CategoryID == logic.CategoryID).CountOf<Entities.Post>() > 0)

                {

                    throw new LogicException("有文章在此类别中不能删除!");

                }

                (DB.Category.CategoryID == logic.CategoryID).Delete<Entities.Category>();

            }

        }

VS2008对代码的感知支持有所提高,编辑器能直接感知到表达式所返回的类型J


视图

       由于VS2008对默认属性的支持,这样大在减少了NClay下的视图代码;在VS2005里不得不对编辑器生成的接口代码进行调整。而VS2008下直接编辑生成接口代码就可以,省了不少修改的工作。

    [NClay.MVC.Action(ActionType = NClay.MVC.ActionType.All, Tag = "~/Default.aspx", Services = new Type[] {

        typeof(Logic.Post.IPostView) })]

    public class Default :BaseView ,Logic.Post.IPostView

    {

        #region IPostView 成员

 

        public string CategoryID

        { get; set; }

 

        public System.Collections.Generic.IList<SmallBlog.Entities.PostView> Posts

        { get; set; }

 

        #endregion

 

        #region IDataPageProperty 成员

        [NClay.MVC.Bind(typeof(NClay.DataPage))]

        public NClay.IDataPage DataPage

        { get; set; }

 

        #endregion

    }

AOP扩展

       很多时候面对多个视图处理同样的逻辑,这时候可以借助于框架的AOP功能完成。以下是统一处理页面左则的功能

    [NClay.MVC.ViewAspect(NClay.MVC.AspectLevel.High)]

    public class AspectBaseView:NClay.MVC.IAspect

    {

        #region IAspect 成员

 

        public void Aspect(object source, NClay.MVC.AspectHandler e)

        {

            if (source is BaseView)

            {

                BaseView bv = (BaseView)source;

                NClay.MVC.Container.Execute<Logic.SysUser.IBlogConfig>(bv, true);

                NClay.MVC.Container.Execute<Logic.Category.IStatCategories>(bv, true);

                NClay.MVC.Container.Execute<Logic.Post.IHotPost>(bv, true);

            }

            e.Execute(source);

        }

 

        #endregion

    }

       为了避加载重复的数据,可以通过AOP来实现逻辑数据的缓存处理。

    [NClay.MVC.LogicAspect(typeof(Logic.SysUser.IBlogConfig),typeof(Logic.SysUser.IEditUserInfo))]

    public class BlogConfigCache : NClay.MVC.IAspect

    {

        #region IAspect 成员

 

        public void Aspect(object source, NClay.MVC.AspectHandler e)

        {

            if (source is Logic.SysUser.IBlogConfig)

            {

                Logic.SysUser.IBlogConfig config = (Logic.SysUser.IBlogConfig)source;

                config.OwnerConfig = CacheUnit.GetBlogConfig();

                if (config.OwnerConfig == null)

                {

                    e.Execute(source);

                    CacheUnit.SetBlogConfig(config.OwnerConfig);

                }

            }

            if (source is Logic.SysUser.IEditUserInfo)

            {

                e.Execute(source);

                CacheUnit.ClearBlogConfig();

            }

        }

 

        #endregion

    }

程序运行效果图

 

下载SmallBlog代码

由于是采用VS2008开发,所以VS2005的朋友打不开该项目。项目是编译成2.0的,所以可以部署在2.0下运行

 

SmallBlog地址

posted on 2007-09-02 13:18 henry 阅读(2420) 评论(14)  编辑 收藏

FeedBack:
2007-09-02 13:55 | try      
学习。
感觉验证那块做的不是很好,应该在客户端验证下,然后提交服务器的时候再验证。现在应该是直接服务器端验证的。
  回复  引用  查看    
2007-09-02 14:14 | Clingingboy      
貌似MVP
  回复  引用  查看    
2007-09-02 14:34 | henry [未注册用户]
@try
验证的jquery插件自己已经写了,加上去也并影响现有任何代码.
没有上来的原因是这功能不是框架的内容:)
  回复  引用    
2007-09-02 14:36 | 火舞狂歌(hxling) [未注册用户]
VS2008beta2中文版 使用的操作系统是XP还是2003,
我在windows server 2003 中装不上VS.NET 2008 BETA2
  回复  引用    
2007-09-02 14:36 | henry [未注册用户]
@Clingingboy
在写这功能的时候发现象MVP,但后来还是定义为MVC.
  回复  引用    
2007-09-02 14:38 | henry [未注册用户]
@火舞狂歌(hxling)
在WIN2003SP1上,很顺利地安装成功.
  回复  引用    
2007-09-02 14:55 | 火舞狂歌(hxling) [未注册用户]
我现在的系统上装有VS2005,现在的系统是WIN 2003 SP2
  回复  引用    
2007-09-02 22:32 | Adrian H.      
强烈支持~
  回复  引用  查看    
2007-09-04 12:37 | fly2008 [未注册用户]
我现在正在做vs2008的测试工作。据我所知WIN 2003 可以安装啊
  回复  引用    
2007-09-04 19:25 | 梦凌 [未注册用户]
奇怪。。。。
ORM直接用LINQ不就完了。。
我个人觉得,现在基于.NET再来说WEB框架的话, 除非你能做到只需要负责HTML和JS的编写就能完成一个想要的站点(当然这在目前貌似还是很不可能的事情)。不然的话这些框架就总是会束缚自己做事情。
  回复  引用    
#11楼 [楼主]
2007-09-05 08:44 | henry      
@梦凌
现在的版本的LINQ在数据操作上面还没让我感觉到惊喜的地步.
可能你对框架的了解太少了,框架注重的表现层和逻辑的隔离.框架可以完全工作在webform的事件模式下,如果你用webform实现过MVP大概能知道其原理.
在MonoRail中并没有达到MVP的隔离的层次,所以框架在Front controller基础上进行了这样一个扩展.

  回复  引用  查看    
2007-09-06 16:57 | 黄春 [未注册用户]
你的框架的早期版本,也就是非AOP的版本,在下已经试用。但感觉你确实应该把ORM的部分和其他成熟框架结合起来,而不是另起炉灶。另外,你要注意的是,你的框架功能太简单了,你应该紧紧围绕一个中心,也就是MVC,写一些真正能让使用者用起来很爽的代码,能快速开发的Framework。否则,我还是觉得ASP.NET的UI比你的什么都没有的NClay要具有吸引力些.
  回复  引用    
#13楼 [楼主]
2007-09-06 17:39 | henry      
@黄春
NClay最初只是实现Front controller,但现在的NClay已经不同了用户可以在同一个项目分别使用Front controller和Page Controller.你虽然认同了PageController,但Front controller存在的理由你也应该清楚.
不知道你有没有看过例程的Aspects部分,那应该是框架的重点了.

  回复  引用  查看    
2007-09-12 17:20 | 麦壳饼 [未注册用户]
佩服。
  回复  引用    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-09-02 13:43 编辑过
 
 


<2007年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829