Вы должны передать свои зависимости через конструктор, желательно интерфейс, например, IDatabaseContext
, но приведенный ниже пример кода основан на вашем коде.Если вы добавите MyAccessClass
в качестве службы, например, services.AddTransient<MyAccessClass>()
, а затем используете внедрение зависимостей в вашем контроллере, контекст базы данных будет автоматически добавлен в конструктор контейнером IoC по умолчанию в ASP.NET Core..
Вы не должны полагаться на IServiceProvider
, причина в том, что ваш класс не хочет делать предположения о реализациях, ему просто нужен контекст базы данных.Полагаясь на IServiceProvider
, можно предположить, что этот контекст и любые возможные будущие зависимости исходят от IoC в ASP.NET Core, что может быть не так (что если вы просто захотите выпустить это позже как библиотеку классов?),Это затруднит тестирование и использование класса MyAccessClass
вне контроллера.
Вы говорите в своем комментарии:
"... или получаете класс Database-Contextв любом другом месте "
То, что в другом месте является полностью гибким, просто принимая контекст в конструктор, так как ваш класс не знает, где находится где-либо еще , ночто бы ни создавал ваш класс, он знает!
Пример DI в ASP.NET Core
Взять контекст как зависимость через конструктор
public class MyAccessClass{
private readonly DatabaseContext databaseContext;
public MyAccessClass(DatabaseContext databaseContext) {
this.databaseContext = databaseContext;
}
}
Добавить как службу
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<MyAccessClass>();
}
Внедрить в контроллер
public class MyController : Controller
{
private readonly MyAccessClass myAccessClass;
//Happily injected through DI
public MyController(MyAccessClass myAccessClass)
{
this.myAccessClass = myAccessClass;
}
}
Или ввести прямо в действие
public class MyController : Controller
{
public MyController()
{
}
public IActionResult MyAction([FromServices] MyAccessClass myAccessClass)
{
}
}