/// <summary>
        /// 获取文章信息
        /// 结果会按文章Id和当前登录用户缓存一定时间
        /// </summary>
        /// <param name="articleId">文章Id</param>
        /// <returns></returns>
        public virtual object GetArticleApiInfo(long articleId)
        {
            // 从缓存中获取
            var info = ArticleApiInfoCache.GetOrDefault(articleId);

            if (info != null)
            {
                return(info);
            }
            // 从数据库中获取
            UnitOfWork.ReadData <Database.Article>(r => {
                var article = r.GetByIdWhereNotDeleted(articleId);
                if (article == null)
                {
                    return;
                }
                var author   = article.Author;
                var classes  = article.Classes.Select(c => new { id = c.Id, name = c.Name }).ToList();
                var tags     = article.Tags.Select(t => new { id = t.Id, name = t.Name }).ToList();
                var keywords = classes.Select(c => c.name).Concat(tags.Select(t => t.name)).ToList();
                info         = new {
                    id         = article.Id,
                    title      = article.Title,
                    summary    = article.Summary,
                    contents   = article.Contents,
                    authorId   = author == null ? null : (long?)author.Id,
                    authorName = author == null ? null : author.Username,
                    classes,
                    tags,
                    keywords,
                    createTime  = article.CreateTime,
                    lastUpdated = article.LastUpdated
                };
                // 保存到缓存中
                ArticleApiInfoCache.Put(articleId, info, ArticleApiInfoCacheTime);
            });
            return(info);
        }