#c# #asp.net #asp.net-core #dependency-injection
#c# #asp.net #asp.net-ядро #внедрение зависимостей
Вопрос:
Я разрабатываю N-уровневое приложение, используя asp.net ядро 3.1
- Приложение.Услуги
- Приложение.Домен
- Приложение.Данные
В application.domain мне пришлось бы использовать интерфейс и один репозиторий
IIntentRepository
,IntentRepository
IPredictionRepository
,PredictionRepository
На моем уровне данных у меня был бы 1 интерфейс
IIntentDataRepository
,IntentDataRepository
Затем в моем файле startup.cs я бы вызывал каждую инъекцию зависимостей следующим образом.
services.AddTransient<IIntentRepository,IntentRepository>();
services.AddTransient<IPredictionRepository,PredictionRepository>();
services.AddTransient<IIntentDataRepository,IntentDataRepository>();
Затем я обычно размещаю интерфейс в конструкторе, например
private readonly IIntentDataRepository intentDataRepsoitory;
public IntentRepository(IIntentDataRepository _intentDataRepsoitory)
{
intentDataRepsoitory = _intentDataRepsoitory;
}
Проблемы в PredictionRepository
том, что я хотел бы вызвать IntentRepository
на уровне домена. Я не уверен, как это сделать, вот как я называю это на уровне моего домена
public class PredictionRepository : IPredictionRepository
{
private readonly IIntentRepository intentRepository;
PredictionRepository(IIntentRepository _intentRepository)
{
intentRepository = _intentRepository;
}
...}
Но я продолжаю получать PredictionRepository
‘не удалось найти. Убедитесь, что тип является конкретным, а службы зарегистрированы для всех параметров общедоступного конструктора.)’
Комментарии:
1. Похоже, это правильно. Вы получаете эту ошибку во время выполнения или сборки?
2. «Убедитесь, что тип является конкретным, а службы зарегистрированы для всех параметров общедоступного конструктора» — конструктор PredictionRepository не помечен как общедоступный. Может ли это быть причиной, или это просто опечатка в вашем скопированном вставленном коде?
3. @Larry я только что обновил код, это был класс, а prediction — конструктор класса, извините за путаницу
4. @Larry прав, класс можно сделать закрытым или внутренним, но конструктор должен быть общедоступным. (Если я правильно помню.) Если вы не предоставляете модификатор доступа, он по умолчанию является закрытым
5. Пожалуйста, попробуйте «public PredictionRepository (IIntentRepository _intentRepository)».
Ответ №1:
Сообщение об исключении выглядит точным:
… Убедитесь, что тип является конкретным, а службы зарегистрированы для всех параметров общедоступного конструктора.
Ваш вставленный код показывает, что PredictionRepository
конструктор не помечен как общедоступный, поэтому механизм DI не может его использовать.