科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航



ZDNet>软件频道>中间件-zhiding>Visual Studio 2008+NClay小试牛刀

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文给出用VS 2008结合NClay进行SmallBlog程序的编写步骤和具体的源代码,供大家参考!

来源:天极网  2007年09月04日

关键字:NClay Visual Studio

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

NClay的结构

图1

SmallBlog

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

程序结构

图2

程序主要分为三大部分:

实体层: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>();

 }

}

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

图3

视图

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

[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

}

程序运行效果图

图4
查看本文来源
推广二维码
邮件订阅

如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

重磅专题