///
<summary> ///
模版类 ///
</summary> public class Template { ///
<summary> ///
模版ID ///
</summary> public Guid
TemplateId { get ;
set ;
} ///
<summary> ///
模版名称 ///
</summary> public string Name
{ get ;
set ;
} ///
<summary> ///
模版内容 ///
</summary> public string Content
{ get ;
set ;
} ///
<summary> ///
是否为部分视图 ///
</summary> public bool IsPartial
{ get ;
set ;
} } |
初步设计就是如此,增加了一个IsPartial属性,因为我们的模版或许会作为部分视图在其他模版里调用,就像UserControl一样。
那么Page类的设计就略显复杂了。我们想访问一个Page起码要有访问路径吧,所以就要有一个UrlPattern属性,也就是访问规则,因为像详细页一般只是参数的变化,所以URL不能写死,只能是一个规则。既然有规则,也会有一些参数,而且参数不一定是?name=value形式,可能是/value/value1形式,所以我们还得设计一个UrlPattern类。
///
<summary> ///
Url访问规则 ///
</summary> public class UrlPattern { ///
<summary> ///
具体规则 ///
</summary> public string Pattern
{ get ;
set ;
} ///
<summary> ///
正则引擎 ///
</summary> public Regex
Regex { get ;
set ;
} ///
<summary> ///
参数列表 ///
</summary> public string []
Parameters { get ;
set ;
} ///
<summary> ///
获取某个参数的值 ///
</summary> ///
<param name="rawurl">当前访问的URL</param> ///
<param name="name">参数名</param> ///
<returns></returns> public string GetValue( string rawurl,
string name) { throw new System.NotImplementedException(); } } |
是的,你没看错,我们要用正则表达式,这可能是对制作人员难度最大的部分。:)不过可以教他们初级的写法,可以应付绝大多数需求。
比如我写一个规则如下 /details/(?<articleid>\d+),这个表明参数名为articleid,访问规则就是 “/details/数字”
Page除了访问URL外还要有缓存的概念,不然我们如何提升性能,你说是不?!缓存可能还会用标签里去,因为如果Page不缓存只是缓存了某个标签,所以Label也要有缓存,那么我们是否需要设计一个缓存类呢?
///
<summary> ///
Page/Template/Label的缓存 ///
</summary> public class Cache { ///
<summary> ///
缓存名 ///
</summary> public string Key
{ get ;
set ;
} ///
<summary> ///
缓存秒数 ///
</summary> public int CacheSeconds
{ get ;
set ;
} ///
<summary> ///
获取缓存数据 ///
</summary> ///
<returns></returns> public object GetData() { throw new System.NotImplementedException(); } ///
<summary> ///
移除缓存 ///
</summary> public void Remove() { throw new System.NotImplementedException(); } ///
<summary> ///
更新缓存 ///
</summary> ///
<param name="data"></param> public void SetData( object data) { throw new System.NotImplementedException(); } } |
那么Page类还应该有什么?Labels!是的,我们不可能每次都去解释模版来获取所有的Label,而是Page被缓存后我们只需要访问他的LabelCollection即可。那么我们来看下Page的设计雏形吧。
///
<summary> ///
Page类 ///
</summary> public class Page { ///
<summary> ///
ID ///
</summary> public Guid
PageId { get ;
set ;
} ///
<summary> ///
名称 ///
</summary> public string Name
{ get ;
set ;
} ///
<summary> ///
标题 ///
</summary> public string Title
{ get ;
set ;
} ///
<summary> ///
关键字 ///
</summary> public string Keywords
{ get ;
set ;
} ///
<summary> ///
描述 ///
</summary> public string Description
{ get ;
set ;
} ///
<summary> ///
模版 ///
</summary> public Template
Template { get ;
set ;
} ///
<summary> ///
访问路径规则 ///
</summary> public UrlPattern
UrlPattern { get ;
set ;
} ///
<summary> ///
标签 ///
</summary> public Label[]
Labels { get ;
set ;
} ///
<summary> ///
缓存 ///
</summary> public Cache
Cache { get ;
set ;
} ///
<summary> ///
显示HTML代码 ///
</summary> public void Render() { throw new System.NotImplementedException(); } } |
不错哦,袄哟,不错哦。
其实对于大型的站点,子站的概念是不可缺少的。或者我们的CMS需要支持多站点,那么还需要一个Site类。
///
<summary> ///
站点 ///
</summary> public class Site { ///
<summary> ///
站点ID ///
</summary> public Guid
SiteId { get ;
set ;
} ///
<summary> ///
站点名称 ///
</summary> public string Name
{ get ;
set ;
} ///
<summary> ///
站点备注 ///
</summary> public string Note
{ get ;
set ;
} ///
<summary> ///
站点域名 ///
</summary> public string []
Domains { get ;
set ;
} ///
<summary> ///
站点状态 ///
</summary> public Status
Status { get ;
set ;
} ///
<summary> ///
站点的页面 ///
</summary> public Page[]
Pages { get ;
set ;
} } |
站点一般包含多个可访问的域名,所以有个Domains。当然站点包含N个Page。
好啦,初步的设计就到这了,下节我们讲怎么让这些类运作起来。