2016-08-01 7 views
8

.NETコアでDIを使用する方法に関する多くのコード例がありますが、いずれもコンストラクタパラメータを使用していません。例えば.NETコアのコンストラクタパラメータを使用した依存性注入

  • 私がアクセス

を持っている場合は、実装のチェックでは、コンストラクタ

  • に現在のHTTPヘッダ(X-API-Key)を注入し
  • 承認サービスを作成します。私はIAuthorizationServiceでDIを使用するだけでなく、トークンをコンストラクタに注入する必要があります。私はNinjectでそれを行う方法を知っていますが、.NET Core DIでの経験はありません。

    ここでは例として示しています。

    public void ConfigureServices(IServiceCollection services) 
    { 
        services.AddMvc(); 
        services.AddEntityFrameworkSqlite(); 
        services.AddDbContext<MainDbContext>(); 
        services.AddScoped<IAuthorizationService, AuthorizationService>(); // Inject current HttpContext header value as a constructor? 
    } 
    
  • +0

    [あなたはこの文書を見てきました](https://docs.asp.net/en/latest/fundamentals/dependency -injection.html) –

    +0

    トークンを注入する必要がありますか、またはトークンを提供するクラスのインタフェースを注入できますか? –

    +0

    @ScottHannenええと、本当に関係ないですね。しかし、テスト容易性がより容易になるので、トークンはより良いでしょう。 – sed

    答えて

    6

    私は通常、データがミドルウェアに設定されているサービスを通じてこのような値を流しています。たとえば、次のように

    注入することができるアクセサクラス:

    public class ApiKeyAccessor 
    { 
        public string ApiKey { get; set; } 
    } 
    

    、要求の先頭にAPIキーを設定し、ミドルウェア:

    public class ApiKeyMiddleware 
    { 
        private readonly RequestDelegate _next; 
    
        public ApiKeyMiddleware(RequestDelegate next) 
        { 
         _next = next; 
        } 
    
        public Task Invoke(HttpContext context, ApiKeyAccessor apiKeyAccessor) 
        { 
         StringValues key; 
         if (context.Request.Headers.TryGetValue("X-Api-Key", out key)) 
         { 
          apiKeyAccessor.ApiKey = key; 
          return _next(context); 
         } 
    
         // todo: throw exception, etc.. 
        } 
    } 
    

    今、すべての私たちがあるしなければなりませんDI容器にApiKeyAccessorを追加してスコープの有効期間を追加し、できるだけ早く、ApiKeyMiddlewareを要求実行パイプラインに追加します。

    正しく設定すると、我々はコントローラやサービスにApiKeyAccessorインスタンスを注入することができます

    public class AuthorizationService 
    { 
        private readonly string _apiKey; 
    
        public AuthorizationService(ApiKeyAccessor apiKeyAccessor) 
        { 
         _apiKey = apiKeyAccessor.ApiKey; 
        } 
    } 
    
    +1

    私はこれが好きです - クラスを注入する - 値が接続文字列のように変わらない限り、値を注入する以上のこと。任意のDIコンテナを使用すると、実行時に値を取得するようにコンテナを設定するよりも、通常はクラスを注入する方が簡単です。 –

    関連する問題