2016-12-13 9 views
1

Webコアサーバーを作成するには、ASP.NET Core v1.1を使用しています。あなたは、私がウェブソケット要求を処理するためにアクセプタタスクを使用しています見ることができるようにASP.NETコアで依存関係を持つミドルウェア関数を作成する

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    // ... 

    // route of "/ws" requests 
    app.Map("/ws", Map); 
} 


public void ConfigureServices(IServiceCollection services) 
{ 
    // add the db service 
    services.AddDbContext<ArticleContext>(
    opts => opts.UseNpgsql("MyConnectionString") 
); 
} 

private void Map(IApplicationBuilder app) 
{ 
    app.UseWebSockets(); 
    app.Use(Acceptor); 
} 

private async Task Acceptor(HttpContext httpContext, Func<Task> next) 
{ 
    // Handle the request using: httpContext.WebSockets.IsWebSocketRequest 
    // ... 
} 

:これは私のStartup.csのダウンにストライプバージョンです。また、DbContextConfigureServicesメソッドに追加します。

私はMVC機能を使用していないので追加しません。しかし、私はデータベースに接続するにはArticleContextにアクセスする必要があります。

私が見たすべての例では、MVCパッケージに付属のコントローラを使用しています。このようなコントローラでは、コンストラクタ依存性注入を使用してDBContextを注入できます。

は私がコントローラーが、私はそこArticleContextインスタンスを取得しますどのようにアクセプタメソッドを使用していませんか?

は私が何とかMyAcceptorクラスを作成し、代わりに依存性を注入することができるようにapp.Mapを使用してのapp.Use()経由でアプリに追加する必要がありますか? ..まあまあです。

+1

あなたはConfigureメソッドシグネチャに必要な依存関係を追加でき、ConfigureServicesに登録されている限り、メソッドに注入されることを知っていますか? –

+0

いいえ私はそれを知らなかった。役に立つことはできますが、私の問題は解決しません。コメントありがとうございました。 –

答えて

3

あなたは次のようにHttpContext.RequestServicesプロパティからArticleContextを解決する必要があります:

private async Task Acceptor(HttpContext httpContext, Func<Task> next) 
{ 
    var context = httpContext.RequestServices.GetRequiredService<ArticleContext>(); 
    // Handle the request using: httpContext.WebSockets.IsWebSocketRequest 
    // ... 
} 

あなたはまた、独自のクラスにAcceptorメソッドをラップすることができます。その場合、そのAcceptorMiddlewareクラスのコンストラクタにArticleContextを注入できますが、これはあなたのケースでは必要ないようです。

+0

私が探したものとまったく同じように見えます。なぜ私はそのような例を見つけられなかったのだろうか。ありがとう、スティーブン!私はできるだけ早くそれを試みます。 –

関連する問題