Внедрение зависимостей ASP.NET Core 2.1; Невозможно внедрить в класс обслуживания

Я создаю веб-API с ASP.NET Core 2.1. У меня есть контроллеры, к которым пользователь может получить доступ через HTTP-запросы. Затем контроллеры вызывают классы обслуживания. Я пытаюсь внедрить свой DbContext в свой собственный класс обслуживания, но всякий раз, когда я это делаю, я получаю ответ 500 с сервера. В моем классе запуска у меня есть

services.AddDbContext<CatalogueContext>(options => options.UseSqlServer(_config.GetConnectionString("DefaultConnection")));

Если я помещу это в класс контроллера, все будет работать

private readonly ITrackServices _service;
private readonly CatalogueContext _dbContext;

public TrackController(ITrackServices service, CatalogueContext dbContext)
{
  _service = service;
  _dbContext = dbContext;
}

Но я не хочу вводить dbContext в контроллер. Если я удалю эту инъекцию из контроллера и попробую то же самое в своем классе обслуживания, как это

private readonly CatalogueContext _dbContext;

public TrackService(CatalogueContext dbContext)
{
  _dbContext = dbContext;
}

это не работает. Поэтому, когда я пытаюсь получить доступ к конечной точке, которая использует TrackService, я получаю 500 с сервера.

TrackService регистрируется как синглтон:

services.AddSingleton<ITrackServices, TrackService>();

Я не знаю, что я делаю неправильно. Должен ли я реализовать какой-то интерфейс в TrackService, чтобы включить внедрение зависимостей или что?

Вы зарегистрировали сервис? например services.AddScoped<ITrackService, TrackService>()

juunas 22.05.2019 15:19
Почему вы не хотите внедрить контекст? Если вы зарегистрируете инъекцию DbContext, она будет работать как в контроллере, так и в службе.
Panagiotis Kanavos 22.05.2019 15:19

@juunas: Спасибо. Я использовал services.AddSingleton<ITrackServices, TrackService>(); Я изменил то, что вы сказали, и теперь это работает.

kivikall 22.05.2019 15:22

Какую ошибку вы получаете? Опубликуйте текст исключения полный, возвращенный Exception.ToString(). Это включает в себя любые внутренние исключения и стек вызовов, который привел к исключению. Это покажет, в чем заключается настоящая проблема. Незарегистрированная зависимость? Или ObjectDisposedException, которое, вероятно, вызвано тем, что ITrackServices является одноэлементным, когда DbContext находится в области действия?

Panagiotis Kanavos 22.05.2019 15:23

Краткий ответ: никогда не используйте DbContext из синглтона.

DavidG 22.05.2019 15:27

@DavidG, по крайней мере, не напрямую

Panagiotis Kanavos 22.05.2019 15:28

@PanagiotisKanavos Как бы вы сделали это косвенно?

DavidG 22.05.2019 15:28

@DavidG это задокументировано, как всегда, в месте неправильно: Фоновые задачи с размещенными службами в ASP.NET Core: использование службы с заданной областью в фоновой задаче. Поиск ссылок на документы становится настоящей проблемой.

Panagiotis Kanavos 22.05.2019 15:31

@DavidG, однако, это техника discretion required. Зачем использовать область синглтон для службы, если стоимость не оправдана?

Panagiotis Kanavos 22.05.2019 15:34

@PanagiotisKanavos О, создаю свой собственный объем, попался, просто не знал, что ты имеешь в виду под «косвенно». Да, недавно мне приходилось делать это в нескольких местах, просто не потому, что это было из синглтона.

DavidG 22.05.2019 15:35
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
10
680
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам также необходимо зарегистрировать сервис:

services.AddScoped<ITrackService, TrackService>();

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

ОП упоминает в комментариях, что сервис уже зарегистрирован как синглтон.

Panagiotis Kanavos 22.05.2019 15:25

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

juunas 22.05.2019 15:26

нет проблем с использованием сервисов с ограниченной областью действия из синглетонов. Правильный способ сделать это описан в документах и ​​повторяющихся вопросах.

Panagiotis Kanavos 22.05.2019 15:27

Хорошо, спасибо. Мне нужно больше узнать об этом. Тем временем я отмечу это как ответ, потому что он все равно решил мою проблему :)

kivikall 22.05.2019 15:28

Использование службы с ограниченной областью действия из синглтона через внедрение конструктора означает, что вы используете удаленную службу после выполнения запроса и удаления области действия. Конечно, вы можете создавать свои собственные области видимости или получать их через набор сервисов внутри метода.

juunas 22.05.2019 15:35

Другие вопросы по теме