我正在构建一个非常简单的休息api。特定控制器下的所有端点都需要QueryContext类型的对象。这个对象是简化的" HttpRequest的版本。
目前,我使用工厂接受HttpRequest并返回QueryContext类型的对象。
public interface IQueryContextFactory
{
QueryContext Create(string query, HttpRequest request);
}
internal class HttpRequestQueryContextFactory : IQueryContextFactory
{
public QueryContext Create(string query, HttpRequest request)
{
if (string.IsNullOrEmpty(query))
throw new ArgumentNullException(nameof(query));
if (request == null)
throw new ArgumentNullException(nameof(request));
return new QueryContext
{
Method = request.Method,
QueryString = string.Concat(query, request.QueryString),
Parameters = request.Query.ToDictionary(x => x.Key, x => x.Value.ToString().Replace("\"", string.Empty)),
Headers = request.Headers.ToDictionary(x => x.Key, x => x.Value.ToString())
};
}
}
然后我从我的终端
调用这个工厂 [HttpGet]
public IActionResult Process(string query)
{
(...)
var ctx = _contextFactory.Create(query, Request);
}
是否建议使用中间件将QueryContext添加到路由数据中?我可以将它作为参数吗?
答案 0 :(得分:0)
您可以在API控制器中注入IQueryContextFactory。
以下是一个例子:
[Route("api/my")]
public class MyController : Controller {
private readonly IQueryContextFactory QueryContextFactory;
public MyController(IQueryContextFactory queryContextFactory) {
if (queryContextFactory == null)
throw new ArgumentNullException(nameof(queryContextFactory));
QueryContextFactory = queryContextFactory;
}
[HttpGet]
public IActionResult Get(string query) {
var ctx = QueryContextFactory.Create(query, Request);
return Ok();
}
}
然后,在Startup.cs
中配置注入,如下所示:
public void ConfigureServices(IServiceCollection services) {
//...
services.AddSingleton<IQueryContextFactory, HttpRequestQueryContextFactory>();
//...
}
您可以找到有关注射here的更多信息。
答案 1 :(得分:0)
如您所示,简化的QueryContext类中的所有数据也位于HttpContext中。而不是将另一个对象注入您的控制器,您可以做几件不同的事情。
初始化QueryContext属性或字段控制器的构造函数。这样,它可用于所有控制器方法,而无需重复代码。
而是添加一个新的类扩展HttpContext类,其中包含一些可以满足您需要的扩展方法。