NSwag自动生成的客户端的正确依赖注入(DI)实现方式是什么?
NSwag生成客户端DI注入错误解决方案
问题根源
该报错是NSwag v13.x版本的默认生成逻辑变更导致的:旧版本NSwag默认生成仅包含HttpClient参数的构造函数,而v13.13.2版本默认开启了baseUrl生成逻辑,自动生成的客户端构造函数多出了string baseUrl参数,DI容器无法自动解析字符串类型参数,因此触发报错。
解决方案
方案1:调整NSwag生成配置(最推荐,无额外代码)
直接修改csproj中的OpenApiReference配置,添加额外生成参数禁用baseUrl构造参数,生成的客户端会直接使用HttpClient的BaseAddress属性作为基地址,完美兼容通用的AddHttpClient写法:
<ItemGroup> <OpenApiReference Include="OpenAPIs\swagger.json" CodeGenerator="NSwagCSharp" Namespace="xxx" ClassName="Client"> <SourceUri>https://localhost:44353/swagger/v1/swagger.json</SourceUri> <!-- 新增如下配置,禁用baseUrl参数生成 --> <AdditionalOptions>/useBaseUrl:false</AdditionalOptions> </OpenApiReference> </ItemGroup>
重新生成项目后,原有注册代码即可正常使用:
services.AddHttpClient<IClient, Client>((provider, client) => { client.BaseAddress = new System.Uri("https://some.baseurl/"); });
方案2:适配现有构造函数注册(无需修改生成配置)
如果不需要调整生成逻辑,可以直接修改服务注册代码,手动传入baseUrl参数即可,无需额外封装代理类:
services.AddHttpClient<IClient, Client>(client => { client.BaseAddress = new Uri("https://some.baseurl/"); }) .AddTypedClient((httpClient, _) => // 手动传入构造函数需要的两个参数 new Client(httpClient.BaseAddress.AbsoluteUri, httpClient) );
内容的提问来源于stack exchange,提问作者mmix
相关产品推荐
相关产品推荐

