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

Я использую класс EfFeatureDal в качестве класса подключения к базе данных, и я использую конструктор для этого подключения. Но когда мне нужно вызвать этот класс из FeatureList, я не могу добавить эти параметры конструктора соединения, поэтому мне нужен базовый конструктор в EfFeatureDal, но я не могу его добавить?

public class FeatureList:ViewComponent
{

    FeatureManager featureManager = new FeatureManager(new EfFeatureDal());

    public IViewComponentResult Invoke() 
    {
        return View();
    }
}

public class EfFeatureDal : GenericRepository<Feature>, IFeatureDal
{
    public EfFeatureDal(Context1 _db) : base(_db)
    {
    }

    public EfFeatureDal() { }

}

Я получил эту ошибку в базовом конструкторе:

Ошибка CS7036 Не указан аргумент, соответствующий обязательный параметр '_db' из 'GenericRepository.GenericRepository(Context1)'
public class FeatureList:ViewComponent
{

    FeatureManager featureManager = new FeatureManager(new EfFeatureDal());

    public IViewComponentResult Invoke() 
    {
        return View();
    }
}

Я получил эту ошибку, когда удалил базовый конструктор в новом FeatureManager (новый EfFeatureDal()):

Ошибка CS7036 Не указан аргумент, соответствующий обязательный параметр '_db' для 'EfFeatureDal.EfFeatureDal(Context1)'

Мы не можем прочитать эти изображения. Пожалуйста, не размещайте изображения технической информации.

Joel Coehoorn 13.02.2023 18:19
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги &lt;ul&gt; и &lt;li&gt; для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
0
1
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ошибка, которую вы сделали, заключается в том, что вы пытаетесь создать экземпляр EfFeatureDal вручную, и вы застряли в ловушке, на самом деле вам нужно знать о концепции DI (внедрение зависимостей) и использовать контейнер IoC для создания экземпляра и внедрения объекта EfFeatureDal в ваши производные объекты. образец можно посмотреть здесь

Я использовал EfFeatureDal для подключения к базе данных, и унаследованный класс хочет, чтобы его параметр и параметр были dbcontext. Вот почему, когда я пытался создать другой конструктор, он хотел получить параметр с ключевым словом «база». И я не могу делать то, что хочу. Вы имеете какое-нибудь представление об этом?

osman 14.02.2023 04:28

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

Community 17.02.2023 19:44
Ответ принят как подходящий
Когда мне нужно вызвать этот класс из FeatureList, я не могу добавить эти параметры конструктора соединения, поэтому мне нужен базовый конструктор на EfFeatureDal, но я не могу его добавить?

Что ж, было бы идеально, если бы вы поделились деталями FeatureManager. Однако, если ваш класс EfFeatureDal неявно определил конструктор внутри него следующим образом:

 public EfFeatureDal(ApplicationDbContext context) : base(context) { }

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

Что вы можете сделать, так это, если вам нужно получить доступ к методам EfFeatureDal или ко всему, что вы там определили, вы можете вызвать его в производном классе, внедрив его интерфейс в конструктор производного класса. Посмотрите в следующем примере:

public class FeatureList : ViewComponent
    {

        private readonly IEfFeatureDal _efFeatureDal;

        public FeatureList(IEfFeatureDal featureDal)
        {

            _efFeatureDal = featureDal;
        }

        public IViewComponentResult Invoke()
        {
           _efFeatureDal... // Anything you want to call from your repository
            return View();
        }
    }

Выход:

В качестве альтернативы:

Если вы определили FeatureManager следующим образом:

public class FeatureManager
    {
        public FeatureManager(EfFeatureDal featureDal) { }
    }

В этом сценарии, если вы хотите вызвать EfFeatureDal в классе, производном от FeatureList, вы должны передать DbContext в качестве параметра его конструктора. Вы можете сделать это следующим образом:

public class FeatureList : ViewComponent
    {
        private readonly ApplicationDbContext _context;
        public FeatureList(ApplicationDbContext dbContext)
        {

           
            _context = dbContext;
        }

        public IViewComponentResult Invoke()
        {

            FeatureManager feature = new FeatureManager(new EfFeatureDal(_context));
            return View();
        }
    }

Примечание. Мы передаем _context в EfFeatureDal, потому что он имеет зависимость от конструктора, то есть public EfFeatureDal(ApplicationDbContext context) : base(context) { }. Таким образом, всегда помните, что конструктор базового класса должен вызываться при создании экземпляров производного класса. Я бы порекомендовал вам проверить наш официальный документ для более подробной информации.

Большое спасибо ! Я видел этот ответ перед сном, я исправлю его в соответствии с вашим ответом. Теперь я понимаю свои ошибки. Я надеюсь, что это будет исправлено

osman 14.02.2023 04:38

Не беспокойтесь, рад помочь вам.

Md Farid Uddin Kiron 14.02.2023 04:41

Я не знаю, как отблагодарить вас. Я работал над ним более 5 часов как начинающий программист. Теперь это работает! Да здравствует братство .Net :D

osman 15.02.2023 00:28

Теперь только я хочу знать, почему мы не можем его распознать (функция FeatureManager = новый FeatureManager (новый EfFeatureDal (_context));) вне вызова? Я все понимаю, кроме этого

osman 15.02.2023 00:33

Спасибо за ваш ответ, разве это не вызвано? Я не понял вашей точки зрения на самом деле. Не могли бы вы опубликовать новый вопрос, если у вас возникнут дополнительные вопросы, я постараюсь объяснить вам там.

Md Farid Uddin Kiron 15.02.2023 01:56

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