【发布时间】:2025-12-12 18:50:01
【问题描述】:
我有一个 .Net 5 Web Api 项目,其中多个控制器的行为类似于操作,应该始终返回状态码 200,Guid 代表因果关系 id。
我为这些命令处理程序创建了一个基类
[ApiController]
public abstract class CommandController : ControllerBase
{
[NonAction]
protected CausationIdResult CausationId(Guid causationId) => new(causationId);
public abstract Task<CausationIdResult> Handle(CancellationToken cancellationToken);
}
public sealed class CausationIdResult : OkObjectResult
{
public CausationIdResult(Guid causationId) : base(causationId) { }
}
一个示例实现可以是
public sealed class DoSomethingController : CommandController
{
[HttpPost("do-something")]
public override Task<CausationIdResult> Handle(CancellationToken cancellationToken)
{
// run logic here
// generate a unique queue id
// pass the queue id back to the client
return Task.FromResult(CausationId(Guid.NewGuid()));
}
}
但是如果我希望从该控制器操作中获得其他参数怎么办?例如。读取参数、查询还是正文?
这是另一个展示可能实现的示例
[HttpPost("do-something/{id}")]
public override Task<CausationIdResult> Handle(CancellationToken cancellationToken, [FromRoute] string id)
{
return Task.FromResult(CausationId(Guid.NewGuid()));
}
但显然这会导致编译错误,因为
没有合适的覆盖方法
是否可以像这样使用动态参数创建抽象方法?
public abstract Task<CausationIdResult> Handle(CancellationToken cancellationToken /* , a type that makes it possible to add all the additional parameters here */);
【问题讨论】:
标签: c# .net-core asp.net-core-webapi .net-5