【发布时间】:2021-01-18 17:39:42
【问题描述】:
我有一个 api 控制器,它使用 Mediatr 进行各种操作。对于其中一些操作,我需要验证用户具有正确的访问级别,因此我使用了授权管道:
public class AuthorisationPipeline<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : IAuthorisedRequest<TResponse>
{
public AuthorisationPipeline()
{ }
public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
{
//Verify User
}
}
{
public interface IAuthorisedRequest : IAuthorisedRequest<Unit>
{ }
public interface IAuthorisedRequest<out TResponse> : IRequest<TResponse>
{
Actor Actor { get; set; }
}
}
所以任何需要授权的请求都继承IAuthorisedRequest接口。
这在运行 API 时可以正常工作,但是,我一直在尝试设置单元测试来运行端到端的 api 调用(或功能测试或皮下测试或任何你想调用它们的东西)。当我尝试运行这些测试时,任何不继承 IAuthorisedRequest 的请求都会引发以下异常:
System.ArgumentException : GenericArguments[0], 'UpdateUsers+Command', on 'AuthorisationPipeline2[TRequest,TResponse]' violates the constraint of type 'TRequest'.
如果我删除where TRequest : IAuthorisedRequest<TResponse>,这可以修复,但是这个管道将为每个请求运行,我宁愿避免。有没有更好的方法来解决这个问题?是什么原因造成的?
【问题讨论】: