使用中间件注入路径数据

时间:2016-12-08 07:48:11

标签: asp.net-core middleware

我正在构建一个非常简单的休息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添加到路由数据中?我可以将它作为参数吗?

2 个答案:

答案 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中。而不是将另一个对象注入您的控制器,您可以做几件不同的事情。

  1. 初始化QueryContext属性或字段控制器的构造函数。这样,它可用于所有控制器方法,而无需重复代码。

  2. 而是添加一个新的类扩展HttpContext类,其中包含一些可以满足您需要的扩展方法。