Я создаю одноразовое приложение в MVC 6 и экспериментирую с разными архитектурами для зависимостей.
Проблема, с которой я сталкиваюсь, заключается в том, как создать пользовательский объект "MyAppContext
", специфичный для приложения. Для этого потребуется некоторая информация из HttpContext
и некоторая информация из базы данных и будет репозиторием с запросом для атрибутов, специфичных для приложения. Я хочу передать экземпляр HttpContext
в конструктор "MyAppContext
".
Я успешно создал объект DataService
с интерфейсом IDataService
, используя DI, и это работает нормально.
Разница с классом "MyAppContext" заключается в том, что он имеет два параметра в конструкторе - "DataService
" и Microsoft.AspNet.Http.HttpContext
. Вот класс MyAppContext:
public class MyAppContext : IMyAppContext
{
public MyAppContext(IDataService dataService, HttpContext httpContext)
{
//do stuff here with the httpContext
}
}
В стартовом коде я регистрирую экземпляр DataService и экземпляр MyAppContext:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
//adds a singleton instance of the DataService using DI
services.AddSingleton<IDataService, DataService>();
services.AddScoped<IMyAppContext, MyAppContext>();
}
public void Configure(IApplicationBuilder app)
{
app.UseErrorPage();
app.UseRequestServices();
app.UseMvc(routes => /* routes stuff */);
}
Я ожидаю, что параметр HttpContext
в конструкторе будет разрешен DI.
При запуске кода это исключение, которое я получаю:
InvalidOperationException: не удается разрешить службу для типа "Microsoft.AspNet.Http.HttpContext" при попытке активировать "MyAppContext"
Я полагаю, это связано с тем, что не существует конкретного экземпляра HttpContext
, что эта ошибка возникает, но я не знаю, как зарегистрировать экземпляр HttpContext
в DI. Я добавил строку 'app.UseRequestServices();
', но это не имело никакого значения. Я также попробовал вариант:
services.AddScoped<HttpContext, HttpContext>();
Но это терпит неудачу, потому что второй HttpContext
должен быть экземпляром - я знаю, что он не правильный, но не смог определить, что есть.
Итак, в резюме - как передать объект HttpContext
в конструктор MyAppContext?