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

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中或者自己搭建的文件系统中(通常用于多服务器负载均衡时使用共同的媒体中心)。

转载于:https://www.cnblogs.com/hahqb/p/kooboo-cms-technical-background.html

Kooboo CMS技术文档之一:Kooboo CMS技术背景相关推荐

  1. 关于我为了看懂技术文档而爬英语技术文档的单词这件事

    想法来源 之前,应该是看了<大话设计数据结构>作者在书中说过(应该是这本书名,如果不是,抱歉,我没记名字的习惯),为了逼自己学英语,爬取英语网站的单词,把英语网站常用的单词,按出现的次数排 ...

  2. IRIS 2021 技术文档 First Look 24 技术概要:容器中的 InterSystems 产品

    技术概要:LDAP 和 InterSystems 产品 目录 技术概要: LDAP 和 InterSystems 产品 1 设置 LDAP 身份验证 1 选择 InterSystems IRIS 实例 ...

  3. IRIS 2021 技术文档 First Look 29 技术概要:LDAP 和 InterSystems 产品

    技术概要:LDAP 和 InterSystems 产品 目录 技术概要: LDAP 和 InterSystems 产品 1 设置 LDAP 身份验证 1 选择 InterSystems IRIS 实例 ...

  4. 代码中如何让无序标记的内容并排_英语技术文档中如何正确使用无序列表和有序列表?...

    Foreword 之前跟大家分享过英语技术文档中如何正确使用时态和英语技术文档中如何正确使用人称,这一篇再跟大家分享一下如何正确使用无序列表和有序列表. 其实,在技术文档中,除了无序列表和有序列表,另 ...

  5. 如何撰写出优秀的技术文档

    技术文档分为两类,一类指开发中要用到的研发文档,一类是给客户看的客户文档,技术文档不仅仅适用于SaaS开发,他在各个领域都很常见,能够帮助记录团队/公司内部的一些资料,便于员工进行查询,通过正确的方法 ...

  6. Guns 技术文档 v5.1

    @stylefeng 2018-10-17 10:22 字数 27433 阅读 4795 Guns 技术文档 v5.1 stylefeng技术文档 Guns 技术文档 v5.1 1. 序言 1.1 文 ...

  7. Guns 技术文档 v1.0

    Guns 技术文档 v1.0 Guns 技术文档 v1.0 1. 序言 1.1 文档简介 1.2 Guns教程 1.3 获取帮助 2. 使用手册 2.1 下载项目 2.2 导入项目 2.2.1 ecl ...

  8. guns技术文档 v5.1

    @stylefeng 2018-10-17 10:22 字数 27433 阅读 4795 Guns 技术文档 v5.1 stylefeng技术文档 Guns 技术文档 v5.1 <ul>& ...

  9. 易优cms uiarclist 文档列表可视化标签

    易优cms:uiarclist 文档列表可视化标签 [基础用法] 名称:uiarclist 功能:文档列表编辑,比uitext.uihtml.uiupload标签多了一个typeid属性,使用时结合h ...

  10. [技术文档] 一劳永逸,用USB设备制作多系统引导

    2019独角兽企业重金招聘Python工程师标准>>> [技术文档] 一劳永逸,用USB设备制作多系统引导  [复制链接] binghe27 艺有所成 当前离线 主题 8  UID ...

最新文章

  1. PHP中阶,PHP进阶
  2. web安全漏洞之CSRF
  3. semantic ui框架学习笔记三
  4. Linux命令集合(更新中。。。)
  5. RTT设备与驱动之PIN设备
  6. JDK库rt包中常用包说明
  7. 字符串相加—leetcode415
  8. pymysql 模块 使用目录
  9. Web Hacking 101 中文版 十七、服务端请求伪造
  10. JavaScript-分支和循环
  11. 【Git】Git如何在不提交当前分支的情况下切换到其它分支进行操作-git stash
  12. JavaScript 格式化日期 年月日星期时分秒
  13. 类对象模型实验:类数据成员大小
  14. 科创板发行上市审核44个问题解答汇编(总11期)
  15. MySQL the configuration step Starting Server is taking the longer than expected
  16. 延禧攻略插曲6首歌词+简谱
  17. 比较线程子进程 占用的内存情况
  18. 南开计算机考研真题,(NEW)南开大学《812计算机综合基础》历年考研真题汇编(83页)-原创力文档...
  19. 【课程·研】软件工程 | 结对编程:建造金字塔(1157)
  20. 在Linux Mint上玩转蓝牙机械键盘

热门文章

  1. 卡券、直充接口文档源码分享
  2. QT Creater新手入门—— 建立类似于vs的解决方案和项目
  3. python点击事件onclick_巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式onblur和onfocus事件window.onload解释小米商城讲解...
  4. C#Lesson05_2 结构体
  5. Threejs中使模型变亮或模型重新贴图
  6. 工作多年后才明白的.NET底层开发技术
  7. BZOJ 2547(匈牙利算法-任意边的处理)
  8. python图像识别的学习
  9. 视频美颜sdk是什么?技术解析与实现原理详解
  10. 前端开发小工具的使用(FSCapture、Chrome、Emmet语法、IDEA自动格式化代码、Snipaster)