Но когда я создаю экземпляр с помощью ключевого слова new
, внедрение зависимостей не работает.
Это принципиально, как работает внедрение зависимостей.
С зависимостямиинъекция, вы просто не должны new
новые объекты.В этом весь смысл внедрения зависимости и инверсии управления .Вместо того, чтобы создавать объекты и управлять зависимостями этих объектов, вы в зависимости от структуры даете вам зависимости , которые вам нужны, не заботясь о том, откуда они на самом деле и как они построены правильно.Таким образом, вы перекладываете ответственность за создание объекта на вызывающего.
Если вам нужно создать объект, имеющий зависимость, то это явный признак того, что вы делаете это неправильно.Распространенная причина этого заключается в том, что вы хотите создать объект для управления его временем жизни или потому, что на самом деле это объект данных, который просто имеет некоторые операции, для работы которых требуются другие зависимости (например, объект, который имеет «сохранить»Метод).В первом случае вы просто так не делаете.Вы просто зависите от этого и позволяете фреймворку управлять временем жизни;если он имеет неправильное время жизни, вам следует перенастроить его с контейнером DI.
В последнем случае, когда у вас есть объект данных с операциями, вы должны разделить его.Вам просто нужно иметь объект данных без какой-либо логики, а затем внедрить некоторую службу менеджера, которая сможет выполнить операцию над этим объектом данных.
Например, в ASP.NET Core Identity у вас естьUser
объект, который является просто нормальной сущностью без какой-либо логики.Например, чтобы добавить роли пользователя или изменить пароль, вы полагаетесь на менеджера пользователей, которого вы можете ввести.Таким образом, сам объект User
не имеет каких-либо зависимостей.
Я бы вообще предложил вам прочитать главу вставка зависимостей в документации ASP.NET Core, чтобы понять, как работает внедрение зависимостей икак это предполагается использовать в рамках.