2015-11-09 2 views
6

Я изучаю тему DI в ASP.NET 5, и я столкнулся с такой проблемой - я не понимаю, как создать новый экземпляр услуги за запрос.Область запроса с ASP.NET 5 и встроенный контейнер DI

Я использую код:

services.AddScoped<ValueStore>(); 

А внутри моего промежуточное программное хватаю значение:

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

Полный код доступен here

И моя проблема: в то время как я ожидал услугу, которая будет обновляться по каждому запросу, ее не произойдет, и она ведет себя так, как если бы она была зарегистрирована как AddSingleton().

Я делаю что-то неправильно?

+0

Что делать, если вы вводите 'ValueStore' в метод' Invoke' промежуточного программного обеспечения? 'app.ApplicationServices' может не содержать службы с запросом и возвращать экземпляр singleton вместо этого. –

+4

У вас должен быть доступ к «HttpContext» в вашем промежуточном программном обеспечении, и в этом случае вы можете получить доступ к «RequestServices» и разрешить вашу услугу по запросу. –

ответ

8

app.ApplicationServices не предоставляет область применения IServiceProvider. Он будет возвращать один экземпляр ValueStore, когда вы используете GetService<>(). У вас есть два варианта здесь:

Используй HttpContext.RequestServices:

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

Или вводит ValueStore в Invoke методе промежуточного слоя:

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

Я клонировал ваш репозиторий и это работает.

+0

Этот код работал должным образом. Однако ответ на мой основной вопрос оказался следующим: я должен был использовать RequestServices вместо ApplicationServices на первом месте. В ApplicationServices никакие варианты Lifetime не имеют значения, и все 3 из них ведут себя, как если бы это был Singleton. – kosmakoff

+0

@kosmakoff Я уже упоминал 'RequestServices'. Теперь я сделал два варианта более ясными. –

+0

Да, ты прав. Это мое плохое внимание, я только видел большой кусок кода и полностью пропустил ссылку «RequestServices» ниже. Спасибо за примеры, теперь для меня все более ясно. Хотел бы я найти ответ, прежде чем я задал этот вопрос. – kosmakoff

Смежные вопросы