• 语言平台
  • 依赖注入方案
  • 存储模型

1. 语言平台

Kooboo CMS基于.NET Framework 4.x,.NET Framework 4.x的一些技术特性成为站点开发人员使用Kooboo CMS必不可少的基础,为提升Kooboo CMS的用户体验来了极大的帮助,这些特别包括:

  • dynamic关键字带来了流畅的数据操作体验

.NET4带来的dynamic关键字,可实现部分的动态语言特性。在Kooboo CMS中,所有的内容都是以key-value的形式存在。在语言对象的表达中,我们使用IDictionary<string,object>类型的对象来表达每一条件内容数据。在这种情况下,我们常规的数据使用方法将会是:

	@foreach (var item in (IEnumerable<IDictionary<string,object>>)ViewData("Articles"))
{
@item["Title"]
}

在引入dynamic对象之后,我们相同逻辑的代码可以简化为:

	@foreach (var item in ViewBag.Articles)
{
@item.Title
}

首先,ViewBag是ASP.NET MVC3中为了方便站点开发人员使用而对ViewData对象的一个dynamic包装,包装之后,所有通过ViewBag访问的ViewData值都被认为是dynamic变量,这时我们不需要进行再一步的类型转换之后就可以调用它的属性和方法。

而用item.Title来代替item[“Title”],也是我们为了适应dynamic的调用方式,继承实现DynamicObject和IDictionary<string, object>(具体定义类型为:Kooboo.Dynamic.DynamicDictionary)。这样的调用方式一方面可以更直观的,另一方面可以让用户更流畅的使用内容的字段值。

  • 匿名对象是MVC相关辅助方法传参的基础

匿名对象是.NET 3.5中带来的一个重要特性,它被大量的用在LINQ和MVC的辅助方法中。在用Kooboo CMS开发中,开发layout和view中使用最多的对象除了dynamic变量之外,另一个重要的对象使用方式就是匿名对象。最常用的就是我们在生成页面URL的时候需要指定参数,那我们会这样来生成:

	@Url.FrontUrl().PageUrl("Articles/detail", new {UserKey = item.UserKey})

其中new { UserKey=item.UserKey }就是一个匿名对象,它所表达的含义就是向Articles/Detail这个页面传递UserKey参数,值是item.UserKey的值。如果此时,还需要传递一个参数可以用:new { UserKey=item.Userkey,Title=item.UserKey},各参数之间以逗号分隔,以此类推。

2. 依赖注入的解决方案

Kooboo CMS一直在致力于寻找最简单轻量的解决方案来做功能设计和技术实现。在Kooboo CMS中,我们的依赖注入使用上可通过添加Dependency这个Attribute的方式来实现。这种注入方式主要用在数据库储存储切换,模板引擎切换等地方。例如以下是用来替换RepositoryProvider的默认实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kooboo.CMS.Common;
using Kooboo.CMS.Content.Models;
using Kooboo.CMS.Common.Runtime.Dependency;
namespace Kooboo.CMS.Content.Persistence.SqlServer
{
[Dependency(typeof(IRepositoryProvider), Order = 2)]
[Dependency(typeof(Kooboo.CMS.Common.Persistence.Non_Relational.IProvider<Repository>), Order = 2)]
public class RepositoryProvider : Kooboo.CMS.Content.Persistence.Default.RepositoryProvider
{
public RepositoryProvider(IBaseDir baseDir)
: base(baseDir) { } public override void Add(Models.Repository item)
{
base.Add(item);
DatabaseHelper.InitializeDatabase(item);
}
public override void Remove(Models.Repository item)
{
try
{
DatabaseHelper.DisposeDatabase(item);
}
catch
{}
base.Remove(item);
}
public override void Initialize(Models.Repository repository)
{
DatabaseHelper.InitializeDatabase(repository);
base.Initialize(repository);
}
public override bool TestDbConnection()
{
var shareConnectionString = SqlServerSettings.Instance.SharingDatabaseConnectionString;
return SQLServerHelper.TestConnection(shareConnectionString);
}
}
}

3. 存储模型

  • 存储模型设计

对于关系的处理,在Kooboo CMS中,对View,Layout,Page,Folder等数据有限且有明确层级关系的数据,尽量使用文件夹层级的关系来表现数据之间的子父和继承关系。这样做,可以做简单,直观的效果外,还方便站点开发人员开发时使用Visual Studio对View进行编辑和修改。

  • 配置数据与内容数据分开存储

在Kooboo CMS中,一个站点由两部分组成:站点管理和内容管理。这两部分数据有着明显的不同:

  1. 站点配置数据,包括View,Layout,Page等数据,这些数据都有一个共同的特点,数据量不是特别大,不需要很复杂的查询。
  2. 内容数据,通常数量会比较大,也会有各种复杂查询。同时对于一个内容管理系统来说,通常还会要求支持各种不同的数据库平台。

针对配置数据和内容数据的不同特点,我们采取了不同的存储策略:

  1. 对配置数据,我们将数据存储在XML文件中,方便部署,维护和导出。配合数据缓存机制来解决有可能出现的性能问题。
  2. 对文本内容数据,我们采用一套的透明的接口来隔离存储实现, 让内容数据可以支持不同数据库引擎。目前我们支持:XML,MongoDB,SqlServer,SqlCe,MySQL,Couchbase等数据库。为了减少部署成本,我们默认使用XML存储,用户安装Kooboo CMS完全不需要任何额外的数据库配置。
  3. 对媒体内容数据,默认我们将媒体内容(比如图片、视频、文档等)存储在磁盘中。同时我们也支持将媒体内容存储在Azure Blob Storage中或者自己搭建的文件系统中(通常用于多服务器负载均衡时使用共同的媒体中心)。

Kooboo CMS技术文档之一:Kooboo CMS技术背景的更多相关文章

  1. Kafka 技术文档

    Kafka 技术文档   目录 1 Kafka创建背景 2 Kafka简介 3 Kafka好处 3.1 解耦 3.2 冗余 3.3 扩展性 3.4 灵活性 & 峰值处理能力 3.5 可恢复性 ...

  2. Atitit usrQBK1600 技术文档的规范标准化解决方案

    Atitit usrQBK1600 技术文档的规范标准化解决方案 1.1. Keyword关键词..展关键词,横向拓展比较,纵向抽象细化拓展知识点1 1.2. 标题必须有高大上词汇,参考文章排行榜,1 ...

  3. RabbitMq 技术文档

    RabbitMq 技术文档 目录 1 AMQP简介 2 AMQP的实现 3 RabbitMQ简介 3.1 概念说明 3.2 消息队列的使用过程 3.3 RabbitMQ的特性 4 RabbitMQ使用 ...

  4. [转]unity3d 脚本参考-技术文档

    unity3d 脚本参考-技术文档 核心提示:一.脚本概览这是一个关于Unity内部脚本如何工作的简单概览.Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的.在脚本对象内部不同志的函数被 ...

  5. Umbraco官方技术文档 中文翻译

    Umbraco 官方技术文档中文翻译 http://blog.csdn.net/u014183619/article/details/51919973 http://www.cnblogs.com/m ...

  6. [转]chrome技术文档列表

    chrome窗口焦点管理系统 http://www.douban.com/note/32607279/ chrome之TabContents http://www.douban.com/note/32 ...

  7. Niagara技术文档汇总

    Niagara技术文档汇总http://wenku.baidu.com/view/ccdd4e2c3169a4517723a38f.html Niagara讲解要点http://wenku.baidu ...

  8. DL动态载入框架技术文档

    DL动态载入框架技术文档 DL技术交流群:215680213 1. Android apk动态载入机制的研究 2. Android apk动态载入机制的研究(二):资源载入和activity生命周期管 ...

  9. 使用Jupyter Notebook编写技术文档

    1.jupyter Notebook的组成 这里它的组件及其工程构成,帮助大家更好的用好jupyter Notebook 组件 Jupyter Notebook结合了三个组件: 笔记本Web应用程序: ...

  10. 技术文档生成工具:appledoc

    做项目一般都会要求写技术文档,特别是提供SDK或者基础组件的.如果手写这类技术文档的话,工作量比编写代码也少不了多少.比如 Java 语言本身就自带 javadoc 命令,可以从源码中抽取文档.本篇我 ...

随机推荐

  1. Java初始化过程

    这篇文章主要讲解Java在创建对象的时候,初始化的顺序.主要从以下几个例子中讲解: 继承关系中初始化顺序 初始化块与构造器的顺序 已经加载过的类的初始化顺序 加载父类,会不会加载子类 创建子类对象会不 ...

  2. C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)

    本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...

  3. Minor【 PHP框架】1.简介

    1.1 Minor是什么 Minor是一个简单但是优秀的符合PSR4的PHP框架,It just did what a framework should do. 只做一个框架应该做的,简单而又强大! ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. 非关系型数据库(NoSql)

    最近了解了一点非关系型数据库,刚刚接触,觉得这是一个很好的方向,对于大数据 方面的处理,非关系型数据库能起到至关重要的地位.这里我主要是整理了一些前辈的经验,仅供参考. 关系型数据库的特点 1.关系型 ...

  6. [原] KVM 虚拟化原理探究(3)— CPU 虚拟化

    KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...

  7. iOS 键盘添加完成按钮,delegate和block回调

    这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...

  8. 在Visual Studio Code中配置GO开发环境

    一.GO语言安装 详情查看:GO语言下载.安装.配置 二.GoLang插件介绍 对于Visual Studio Code开发工具,有一款优秀的GoLang插件,它的主页为:https://github ...

  9. Javascript学习笔记

    Javascript 2016年12月19日整理 JS基础 Chapter1 JS是一门运行在浏览器客户端的脚本编程语言,前台语言 组成部分 1. ECMAscript JS标准 2. DOM 通过J ...

  10. Maven(一)linux下安装

    1.检查是否安装JDK,并且设置了环境变量(JAVA_HOME): echo $JAVA_HOME java -version 运行结果: 显示jdk的安装路径,和java的版本,如: #jdk路径 ...