ASP.NET Core Swagger能否复用共享契约程序集中的类型?
复用共享契约程序集类型的解决方案
当然可以复用共享契约程序集里的类型,下面给你几个实用的方案:
1. 用SchemaFilter自定义替换逻辑
SwaggerGenOptions里的MapType只能做简单的类型映射,如果你需要更灵活的控制(比如只替换特定DTO),可以自定义ISchemaFilter拦截Swagger的Schema生成过程,把指定类型替换成共享程序集里的类型。
示例代码:
public class ReplaceWithSharedTypeFilter : ISchemaFilter { private readonly Type _sharedUserDtoType = typeof(SharedContracts.UserDto); private readonly Type _generatedUserDtoType = typeof(GeneratedClient.UserDto); public void Apply(OpenApiSchema schema, SchemaFilterContext context) { // 判断当前处理的类型是否是生成的目标类型 if (context.Type == _generatedUserDtoType) { // 替换成共享程序集里的类型 context.SchemaRepository.Schemas.Remove(_generatedUserDtoType.Name); var sharedSchema = context.SchemaGenerator.GenerateSchema(_sharedUserDtoType, context.SchemaRepository); context.SchemaRepository.Schemas[_sharedUserDtoType.Name] = sharedSchema; schema.Reference = new OpenApiReference { Type = ReferenceType.Schema, Id = _sharedUserDtoType.Name }; } } } // 在Startup/Program.cs里注册 services.AddSwaggerGen(c => { c.SchemaFilter<ReplaceWithSharedTypeFilter>(); });
2. 调整客户端生成工具的配置(推荐)
如果你用的是NSwag、AutoRest这类客户端生成工具,它们本身就支持直接引用现有共享程序集的类型,不用手动修改Swagger配置。
比如NSwag可以在配置文件里指定要复用的共享类型:
{ "codeGenerators": { "openApiToCSharpClient": { "typeAccessModifier": "public", "generateDtoTypes": true, "existingContracts": [ { "assemblyPath": "../SharedContracts/bin/Debug/net6.0/SharedContracts.dll", "typeNames": ["SharedContracts.UserDto", "SharedContracts.OrderDto"] } ] } } }
这样生成客户端代码时,工具会自动使用共享程序集里的UserDto和OrderDto,而不是重新生成这些类型。
3. 结合MapType和自定义逻辑
如果只是少数基础类型需要替换,可以先用MapType做基础映射,再用SchemaFilter处理复杂场景:
services.AddSwaggerGen(c => { // 直接映射基础类型 c.MapType<GeneratedClient.DateTimeDto>(() => new OpenApiSchema { Type = "string", Format = "date-time" }); // 用过滤器处理复杂DTO c.SchemaFilter<ReplaceWithSharedTypeFilter>(); });
注意事项
- 确保共享程序集的类型和Swagger定义的结构完全一致(字段名、数据类型、可空性、枚举值等),否则会出现序列化/反序列化错误。
- 如果共享类型有更新,要同步更新Swagger定义,避免出现不匹配的情况。
内容的提问来源于stack exchange,提问作者mdzieg
相关产品推荐
相关产品推荐

