MilanJovanovic博客技能Skill milan-jovanovic-blog

本技能提供对 Milan Jovanovic .NET 技术博客内容的搜索和访问,专注于 Clean Architecture、领域驱动设计、CQRS 等软件架构模式,帮助开发者应用已验证的代码示例和指导,适用于 .NET 10 及以上版本的项目优化。关键词:Clean Architecture, DDD, CQRS, .NET, 软件架构, 代码模式, ASP.NET Core, Entity Framework Core。

架构设计 0 次安装 0 次浏览 更新于 3/11/2026

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. 仅抓取列表页面(1-2 次请求)
  2. 从列表 Markdown 解析日期(无网络)
  3. 与索引比较以识别新文章
  4. 仅抓取尚未索引的文章

检查新文章(预过滤)

抓取前,检查需要更新的内容:

# 检查自 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_indexcontent_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 - 主动项目分析和推荐

故障排除

未找到结果

  1. 检查索引是否存在:python scripts/management/manage_index.py count
  2. 如果计数为 0,运行抓取:/milan-jovanovic:scrape-posts
  3. 验证标签: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