Внедрение зависимостей с базой данных. Как получить Database-Context в обычном классе - PullRequest
0 голосов
/ 18 марта 2019

Я настроил мою службу .net-core 2.1 с контекстом базы данных в методе запуска.

 services.AddDbContext<DatabaseContext>(options => options.UseSqlServer(Configuration.GetConnectionString(nameof(DatabaseContext))));

Теперь я могу сделать следующее, чтобы получить мой контекст базы данных в моем контроллере:

var context = serviceProvider.GetService<DatabaseContext>();

Это работает очень хорошо.Но как я могу получить доступ к Database-Context в обычном классе, что-то вроде этого должно быть сделано:

public class MyAccessClass{

    public MyAccessClass(){

        //Access the ServiceProvider or get the Database-Context class anywhere else
    }
}

Я не хочу передавать объект database-context через конструктор или инициализировать класс DatbaseContextснова.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 19 марта 2019

Вы должны передать свои зависимости через конструктор, желательно интерфейс, например, 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)
     {

     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...