Внедрение зависимостей asp.net n-уровень c#

#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 не может его использовать.