Почему пустует DI контейнер при корректном добавлении сервисов?

Проект на ASP .Net Core MVC. База данных MS SQL Server. Взаимодействие с бд, с помощью EF Core. Написал класс для инициализации созданных в нем списков данными из базы. Класс написан по шаблону "Singlton" , так как необходим один экземпляр этого класса.

Код класса инициализатора:
Код класса инициализатора

Репозиторий с CRUD методами подключил как сервис в DI контейнере. Вроде все везде корректно. Но при запуске приложения, вылетает System.NullReferenceException: "Object reference not set to an instance of an object." В Чем может быть дело? Почему экземпляры репозитория а вместе с ним и логгера не регестрируются в контейнере?
Класс Program(не копировал маршруты)

Исключение:
spoiler
System.NullReferenceException
HResult=0x80004003
Сообщение = Object reference not set to an instance of an object.
Источник = VartanMVCv2
Трассировка стека:
в VartanMVCv2.Domain.Modelinitializer.d__41.MoveNext() в C:UsersДмирийsourcereposAcceptme3VartanMVCv2DomainModelinitializer.cs:строка 64

Вот это вот все сервисы репозитория

Дополнительно:

Нельзя idisposable экземпляр делать одиночкой. Вас не смущают настойчивые предупреждения компилятора о наличии непроинициализированных полей предназначенных только для чтения в классе?

  • Kano, реализация интерфейса ничего не меняет. Главное правильно организовать вызов метода Dispose().
  • Дмитрий, тут проблема иного плана. Сторона получающая экземпляр реализующий idisposable должна после его использования вызвать dispose (это такое соглашение у которого конечно есть исключения, но они прописаны явно)
  • я понял Вас, буду иметь ввиду этот момент, спасибо
  • насколько я понимаю, проблема в следующем. В классе инициализатора два конструктора: конструктор по умолчанию, приватный, инициализирует объект в который не попадают сервисы из DI контейнера т.к для этого определяется пользовательский конструктор с параметрами. Получается в итоге создается больше одного объекта инициализатора . Как это обойти? знаю что ответ простой но уже не одупляю.

    UPD. Решил проблему выносом списков с данными в класс и его уже сделал одиночкой.

    Ответы:

    Ошибка говорит о том, что ошибка не в регистрации сервисов, а внутри GetAllAsync при foreach или материализации запроса.

    • не должно там быть ошибки. Эта часть кода работала исправно при другой реализации получения данных из бд. Я просто по сути попытался вынести листы в отдельный класс.

      на всякий случай прилагаю репозиторий для сущьностей в бд.
      spoiler

    Попробуйте убрать конструктор без параметров в Modelinitializer.

    • Убрать конструктор не получится потому что мне нужно создать экземпляр этого класса. Разве что переписать класс инициализатора как сервис но тогда мне придется и контекст базы данных делать а это уже геморрой. Почему провайдер сервисов не использует отведенный ему конструктор с параметрами?
    • Попытался убрать конструктор по умолчанию. Вместо него создал и сделал приватным другой конструктор с одним параметром . ошибка та же, ничего не меняется.
    • Дмитрий, попробуйте пометить конструктор атрибутом [ActivatorUtilitiesConstructor]

     

    Для решения данной проблемы вы можете воспользоваться услугами фрилансеров. Мы выполним необходимую работу быстро и качественно.

     

      • Почему пустует DI контейнер при корректном добавлении сервисов?Есть ответ
      • 07.04.2024
      Ответить

      Пустой DI контейнер может возникнуть по нескольким причинам, давайте рассмотрим их и возможные способы решения:

      1. Неправильное добавление сервисов: убедитесь, что вы правильно добавляете сервисы в DI контейнер. Каждый сервис должен быть добавлен с уникальным идентификатором, чтобы DI контейнер мог правильно его идентифицировать. Также убедитесь, что вы не добавляете один и тот же сервис несколько раз.

      2. Отсутствие зависимостей: если в ваших сервисах есть зависимости от других сервисов, убедитесь, что эти зависимости также добавлены в DI контейнер. В противном случае DI контейнер не сможет создать экземпляр сервиса из-за отсутствия необходимых зависимостей.

      3. Не правильная конфигурация DI контейнера: убедитесь, что вы правильно настраиваете DI контейнер и используете правильные методы для добавления и получения сервисов. Например, вы можете использовать методы add() и get() для добавления и получения сервисов соответственно.

      Если после выполнения вышеперечисленных шагов DI контейнер все еще остается пустым, возможно проблема в другом месте вашего приложения. Проверьте логи ошибок и убедитесь, что все зависимости и конфигурации загружаются правильно. Если проблема продолжает оставаться, попробуйте использовать отладчик для более детального анализа процесса создания DI контейнера.

    Оставить комментарий