2016-12-08 13 views
1

私は非常に単純な残りの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

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についての詳細情報を見つけることができます。

+0

単体テストの方が簡単なので、このアプローチにします。 – Seb

0

簡略化されたQueryContextクラスのすべてのデータは、HttpContextにも含まれています。コントローラに別のオブジェクトを注入するのではなく、いくつかの異なることを行うことができます。

  1. QueryContextプロパティまたはコントローラのコンストラクタのフィールドを初期化します。これにより、コードを複製することなく、すべてのコントローラメソッドで使用できるようになります。

  2. 新しいクラス拡張HttpContextクラスをいくつかの拡張メソッドで追加します。

+0

HttpContextを拡張するとこれは単体テストにも簡単ですか? – Seb

+0

HttpContext拡張メソッドをテストするのは本当に簡単ですが、それはおそらくあなたの質問ではありません。ユニットテストのコントローラーになると、私は答えがノーだと思う。私がMVCで扱っているほとんどのアプリケーションでは、最初の投稿で説明されているよりも多くの点でコンテキストがコントローラに影響します。[Authorize]タグについて考えてみてください。 HttpContextの周りのファサードは、一般的な解決策を提供しません。私は代わりに嘲笑されたWebHostを使ってテストします。そうすれば、DbContextのような他のものを注入することを含め、HttpContextを完全に偽造することができます... – GlennSills

関連する問題