2017-03-23 4 views
2

私はAsp .Net CoreでWebApiを使用しています。ミドルウェアとコントローラのすべてが依存関係注入によってアクセスできる新しいスコープサービスを追加することができますか?または、代わりにHttpContext.Itemsと状態を共有する必要がありますか? WebApiコントローラではHttpContextがまったく使用できないので、それは意図されていないようです。カスタムミドルウェア内に新しいスコープサービスを追加できますか?

HttpContextまたはDIのどちらもこれに適したツールでない場合、要求を最初から作成せずにrequest-pipelineにどのように伝播できますか?

答えて

1

まず、あなたのConfigureServicesに

services.AddScoped<IMyService, MyService>(); 

を(IServiceCollectionサービス)をごスコープサービスを追加し、あなたのミドルウェアに注入スコープのサービスを取得するために私の知っている唯一の方法は、あなたのInvokeメソッドにそれを注入することですそれが唯一の起動時に呼ばれていますようMiddlware

MyMiddlewareのコンストラクタに注入
public class MyMiddleware 
{ 
    private readonly RequestDelegate _next; 

    public MyMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    } 

    public async Task Invoke(HttpContext httpContext, IMyService service) 
    { 
     service.DoSomething(); 
     await _next(httpContext); 
    } 
} 

は、デフォルトでシングルトンようになります。 Invokeは毎回呼び出され、依存関係注入はスコープ付きオブジェクトを取得します。

+0

それはかなりありませんが、それは動作します。ありがとう。 –

1

ミドルウェアには、2つの拡張方法があります。 MVCをチェックしてください。例えば、services.AddMvc()app.UseMvc()です。最初のコンポーネントでは、コンポーネントを追加できます。

public static class MyMiddlewareExtensions 
{ 
    public static IServiceCollection AddMyMiddleware(
     this IServiceCollection serviceCollection) 
    { 
     serviceCollection.AddTransient<IMyMiddlewareInterface, MyMiddlewareConcrete>(); 
    } 
} 

そしてあなたConfigureServices方法で:たとえば

services.AddMyMiddleware(); 
関連する問題