首页
/ ModelContextProtocol C SDK中的服务注册扩展方法实践

ModelContextProtocol C SDK中的服务注册扩展方法实践

2025-07-08 00:39:42作者:温玫谨Lighthearted

在ModelContextProtocol C# SDK的开发过程中,服务注册的模块化设计是一个重要考量。本文探讨了如何通过IServiceCollection扩展方法实现工具和提示的灵活注册,以及这种设计模式在模块化框架中的优势。

背景与需求

在基于OrchardCore CMS等模块化框架开发MCP服务器时,需要支持不同功能模块独立注册自己的工具、资源和提示。这种需求源于现代应用开发的模块化趋势,其中各个功能组件可以按需加载和组合。

传统服务注册方式

ModelContextProtocol SDK原本提供了通过IMcpServerBuilder进行服务注册的方式,例如:

services.AddMcpServer()
    .WithToolsFromAssembly(typeof(MyTool).Assembly);

这种方式虽然有效,但在模块化场景下,每个模块都需要获取IMcpServerBuilder实例,这在某些框架设计中可能不够直观。

IServiceCollection扩展方案

更符合模块化设计的方式是直接为IServiceCollection提供扩展方法:

// 工具注册扩展
public static IServiceCollection AddMcpTool<T>(this IServiceCollection services) 
    where T : class, IMcpTool
{
    services.AddMcpServer();
    services.AddSingleton<IMcpTool, T>();
    return services;
}

// 提示注册扩展
public static IServiceCollection AddMcpPrompt<T>(this IServiceCollection services)
    where T : class, IMcpPrompt
{
    services.AddMcpServer();
    services.AddSingleton<IMcpPrompt, T>();
    return services;
}

设计优势

  1. 模块化友好:各功能模块可以直接使用这些扩展方法,无需关心IMcpServerBuilder的获取
  2. 代码简洁:注册单个工具或提示时代码更加直观
  3. 框架集成:更容易与其他DI框架和模块系统集成
  4. 可发现性:IDE的智能提示能更好地展示可用注册选项

实现考量

在实现这类扩展方法时,需要注意几个关键点:

  1. 幂等性处理:确保AddMcpServer()的多次调用不会造成副作用
  2. 生命周期管理:根据工具和提示的实际使用场景选择合适的生命周期(Singleton/Scoped/Transient)
  3. 配置分离:将核心服务注册与具体功能实现分离,保持架构清晰

实际应用示例

在模块化CMS中,不同模块可以这样使用:

// 天气模块
services.AddMcpTool<WeatherTool>()
    .AddMcpPrompt<WeatherPrompt>();

// 日历模块
services.AddMcpTool<CalendarTool>();

这种设计使得各功能模块的MCP相关组件可以完全独立注册,符合模块化架构的设计原则。

总结

通过IServiceCollection扩展方法注册MCP工具和提示,为模块化应用开发提供了更优雅的解决方案。这种模式不仅提高了代码的可读性和可维护性,还更好地支持了现代应用的模块化需求。开发者在实现类似功能时,应充分考虑幂等性、生命周期管理等关键因素,确保扩展方法的健壮性和可靠性。

登录后查看全文
热门项目推荐
相关项目推荐