name: milan-jovanovic-blog description: 搜索 Milan Jovanovic 的 .NET 博客,查找 Clean Architecture、DDD、CQRS、EF Core 和 ASP.NET Core 模式。用于查找适用的模式、代码示例和架构指导。当处理 .NET 项目,并可能受益于已验证的架构模式时调用。 allowed-tools: Read, Glob, Grep, Bash
Milan Jovanovic 博客技能
概述
本技能提供对 Milan Jovanovic 精选的 .NET 博客内容的访问,筛选至 2025 年 11 月及之后(与 .NET 10 GA 对齐)。它帮助开发者发现和应用 Clean Architecture、领域驱动设计、CQRS、Entity Framework Core 和 ASP.NET Core 的已验证模式。
内容范围: 2025 年 11 月及之后发表的文章,已去除推广内容。
何时使用此技能
在以下情况下使用此技能:
- 处理 .NET 项目,并可能受益于架构模式
- 实现 Clean Architecture、DDD、CQRS 或垂直切片模式
- 配置 Entity Framework Core 或 ASP.NET Core
- 寻找已验证的 .NET 代码模式和示例
- 研究 .NET 10/Aspire 功能
快速开始
按关键词搜索
python scripts/core/find_articles.py search clean architecture cqrs
按标签过滤
python scripts/core/find_articles.py tag ef-core
解析 doc_id 到路径
python scripts/core/find_articles.py resolve milanjovanovic-tech-blog-{slug}
自然语言查询
python scripts/core/find_articles.py query "how to implement CQRS"
列出最近文章
python scripts/core/find_articles.py list --sort date --limit 10
标签分类
| 标签 | 描述 |
|---|---|
clean-architecture |
清洁/洋葱/六边形架构模式 |
ddd |
领域驱动设计(聚合、值对象、领域事件) |
cqrs |
命令查询职责分离 |
mediatr |
MediatR 库使用模式 |
ef-core |
Entity Framework Core 优化和模式 |
aspnet-core |
ASP.NET Core 模式和最小 API |
modular-monolith |
模块化单体架构 |
vertical-slice |
垂直切片架构 |
dotnet-10 |
.NET 10 功能和模式 |
aspire |
.NET Aspire 模式 |
result-pattern |
结果模式用于错误处理 |
outbox-pattern |
事务性发件箱模式 |
specification-pattern |
规范模式 |
repository-pattern |
仓储模式 |
validation |
FluentValidation 模式 |
testing |
单元/集成测试模式 |
路径解析
Windows PowerShell 用户: 避免 cd && python 链 - 使用绝对路径或从仓库根目录运行,以防止路径重复问题。
脚本位置: 所有脚本位于技能根目录的 scripts/ 目录下。
规范内容: 抓取的文章存储在 canonical/milanjovanovic-tech/blog/ 目录下。
索引管理
检查索引统计
python scripts/management/manage_index.py stats
验证索引完整性
python scripts/management/manage_index.py verify
刷新索引(抓取后)
python scripts/management/refresh_index.py
抓取(使用 /scrape-posts 命令)
对于抓取操作,使用 /milan-jovanovic:scrape-posts 命令,该命令处理:
- 预过滤优化 - 从列表页面解析日期后再抓取单个文章
- 日期过滤(2025 年 11 月及之后)
- 内容清理(移除推广部分)
- 幂等更新(通过内容哈希比较跳过未更改的文章)
效率优化
抓取工作流使用 预过滤 以最小化 firecrawl API 调用:
| 场景 | 无优化 | 有优化 | 节省 |
|---|---|---|---|
| 无新文章 | 10+ 请求 | 1-2 请求 | 80-90% |
| 1 篇新文章 | 10+ 请求 | 2-3 请求 | 70-80% |
| 强制(未更改) | 10+ 请求 | 10+ 请求(跳过写入) | I/O 节省 |
工作原理:
- 仅抓取列表页面(1-2 次请求)
- 从列表 Markdown 解析日期(无网络)
- 与索引比较以识别新文章
- 仅抓取尚未索引的文章
检查新文章(预过滤)
抓取前,检查需要更新的内容:
# 检查自 2025 年 11 月以来的新文章
python scripts/core/check_new_articles.py .claude/temp/listing.md --json --since 2025-11-01
# 强制模式 - 包括现有文章进行重新检查
python scripts/core/check_new_articles.py .claude/temp/listing.md --json --force
# 仅输出 URL
python scripts/core/check_new_articles.py .claude/temp/listing.md --urls-only
输出包括 to_scrape 列表,包含 in_index 和 content_hash 以进行智能处理。
Python API
对于程序化访问,使用公共 API:
from milan_jovanovic_api import (
search_articles,
get_by_tag,
resolve_doc_id,
get_article_content,
)
# 按关键词搜索
results = search_articles(['clean-architecture', 'cqrs'])
# 按标签获取文章
ef_articles = get_by_tag('ef-core')
# 解析 doc_id 到路径
path = resolve_doc_id('milanjovanovic-tech-blog-some-slug')
# 获取文章内容
content = get_article_content('milanjovanovic-tech-blog-some-slug')
内容清理
抓取的文章已移除推广内容:
- 赞助部分(标题和第一个 H2 之间)
- 推广页脚(“无论何时准备好,有 X 种方式…”)
- 新闻订阅注册部分
- 课程 CTA
- 阅读时间元数据
所有教育内容、代码块和内部链接均保留。
相关组件
- 命令:
/milan-jovanovic:scrape-posts- 抓取新文章 - 代理:
blog-advisor- 主动项目分析和推荐
故障排除
未找到结果
- 检查索引是否存在:
python scripts/management/manage_index.py count - 如果计数为 0,运行抓取:
/milan-jovanovic:scrape-posts - 验证标签:
python scripts/core/find_articles.py tag --list
Windows 上的路径问题
使用 PowerShell 或在 Git Bash 前加上 MSYS_NO_PATHCONV=1:
MSYS_NO_PATHCONV=1 python scripts/core/find_articles.py search cqrs
版本历史
- v1.1.0 (2025-12-27): 预过滤优化 - 减少 80-90% 的 firecrawl API 调用
- v1.0.0 (2025-12-22): 初始发布 - 2025 年 11 月及之后文章,完整标签分类
最后更新: 2025-12-27