2015-11-09 6 views
6

私はASP.NET 5でDIのトピックを調べていますが、そのような問題に直面しました。新しいインスタンスを作成する方法がわかりませんリクエストごとのサービスASP.NET 5とビルトインされたDIコンテナのリクエストごとのスコープ

私は、コードを使用

services.AddScoped<ValueStore>(); 

そして、私のミドルウェア内部の私は値をつかむ:

var someValueStore = app.ApplicationServices.GetService<ValueStore>(); 

完全なコードはhere

利用可能であり、私の問題がある:私はこれを期待している間にサービスごとに更新する必要はありませんが、それはAddSingleton()として登録されているかのように動作します。

何か間違っていますか?

+0

ミドルウェアの 'Invoke'メソッドに' ValueStore'を挿入するとどうなりますか? 'app.ApplicationServices'はリクエストスコープのサービスを含んでおらず、代わりにシングルトンインスタンスを返すかもしれません。 –

+4

ミドルウェアの 'HttpContext'にアクセスする必要があります。その場合、' RequestServices'にアクセスしてリクエストごとのサービスを解決することができます。 –

答えて

8

app.ApplicationServicesは、リクエストスコープIServiceProviderを提供していません。 GetService<>()を使用すると、ValueStoreのシングルトンインスタンスが返されます。私はあなたのレポをクローニングして、この作品

public async Task Invoke(HttpContext httpContext, ValueStore valueStore) 
{ 
    await httpContext.Response.WriteAsync($"Random value = {valueStore.SomeValue}"); 
    await _next(httpContext); 
} 

使用HttpContext.RequestServices

var someValueStore = context.RequestServices.GetService<ValueStore>(); 

やミドルウェアのInvoke方法でValueStoreを注入あなたはここに2つのオプションがあります。

+0

このコードは期待どおりに機能しました。しかし、私の主な質問に対する答えは、まずApplicationServicesの代わりにRequestServicesを使用していたはずです。 ApplicationServicesでは、生涯オプションでは何の違いもなく、3つすべてがSingletonの場合のように動作します。 – kosmakoff

+0

@kosmakoff私はすでに 'RequestServices'について言及しました。私は2つのオプションをより明確にしました。 –

+0

はい、そうです。それは私の貧弱な注意です、私はコードの大きな塊を見て、完全に以下の 'RequestServices'リファレンスを見逃しました。例をいただきありがとうございます、今私はすべてがより明確です。私はこの質問をする前に答えを見つけることができたらいいと思う。 – kosmakoff