同一解决方案内如何调用Controller方法?无需完整URL及自定义传参
同一解决方案内调用Controller方法的可行方案
1. 直接调用MediatR命令(最优选择)
你的Controller方法核心是调用_mediator.SendExternal,如果调用方和Controller在同一解决方案且能获取到IMediator实例,完全可以跳过Controller直接执行命令:
var command = new AcceptBidDeliveryDateOutOfScheduleBySupplierCommand { // 填充自定义参数 }; var cancellationToken = CancellationToken.None; _currentUserContext.UserLogin = nameof(AcceptBidDeliveryDateOutOfSchedule); var response = await _mediator.SendExternal< AcceptBidDeliveryDateOutOfScheduleBySupplierCommand, AcceptBidDeliveryDateOutOfScheduleBySupplierCommandResponse> (command, cancellationToken);
这种方式无需HTTP请求,性能最高,也避免了参数序列化的麻烦。
2. 使用本地测试主机+HttpClient(需模拟HTTP管道时用)
如果必须通过PostAsync调用(比如需要走完整中间件流程),可以用WebApplicationFactory创建本地HttpClient,无需完整外部URL:
示例代码:
// 初始化测试主机 var factory = new WebApplicationFactory<Program>(); var client = factory.CreateClient(); // 构造命令参数 var command = new AcceptBidDeliveryDateOutOfScheduleBySupplierCommand { // 填充参数内容 }; // 序列化参数为JSON请求体 var jsonContent = new StringContent( JsonSerializer.Serialize(command), Encoding.UTF8, "application/json"); // 发送POST请求,使用相对路由 var response = await client.PostAsync( $"/{nameof(YourController)}/{nameof(AcceptBidDeliveryDateOutOfSchedule)}", jsonContent); // 解析响应结果 var responseJson = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize<AcceptBidDeliveryDateOutOfScheduleBySupplierCommandResponse>(responseJson);
注意替换YourController为实际的Controller类名,若Controller有路由前缀需一并添加。
3. 直接实例化Controller调用(不推荐)
若一定要直接调用Controller方法,需手动注入其依赖(如_currentUserContext、_mediator):
var controller = new YourController(_currentUserContext, _mediator); var command = new AcceptBidDeliveryDateOutOfScheduleBySupplierCommand { // 填充参数 }; var response = await controller.AcceptBidDeliveryDateOutOfSchedule(command, CancellationToken.None);
此方式不推荐,因为Controller设计用于处理HTTP请求,直接实例化可能跳过部分初始化逻辑,且依赖管理容易出错。
内容的提问来源于stack exchange,提问作者Tanya
相关产品推荐
相关产品推荐

