Я использую класс 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)'
Ошибка, которую вы сделали, заключается в том, что вы пытаетесь создать экземпляр EfFeatureDal вручную, и вы застряли в ловушке, на самом деле вам нужно знать о концепции DI (внедрение зависимостей) и использовать контейнер IoC для создания экземпляра и внедрения объекта EfFeatureDal в ваши производные объекты. образец можно посмотреть здесь
Я использовал EfFeatureDal для подключения к базе данных, и унаследованный класс хочет, чтобы его параметр и параметр были dbcontext. Вот почему, когда я пытался создать другой конструктор, он хотел получить параметр с ключевым словом «база». И я не могу делать то, что хочу. Вы имеете какое-нибудь представление об этом?
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
Когда мне нужно вызвать этот класс из 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) { }
. Таким образом, всегда помните, что конструктор базового класса должен вызываться при создании экземпляров производного класса. Я бы порекомендовал вам проверить наш официальный документ для более подробной информации.
Большое спасибо ! Я видел этот ответ перед сном, я исправлю его в соответствии с вашим ответом. Теперь я понимаю свои ошибки. Я надеюсь, что это будет исправлено
Не беспокойтесь, рад помочь вам.
Я не знаю, как отблагодарить вас. Я работал над ним более 5 часов как начинающий программист. Теперь это работает! Да здравствует братство .Net :D
Теперь только я хочу знать, почему мы не можем его распознать (функция FeatureManager = новый FeatureManager (новый EfFeatureDal (_context));) вне вызова? Я все понимаю, кроме этого
Спасибо за ваш ответ, разве это не вызвано? Я не понял вашей точки зрения на самом деле. Не могли бы вы опубликовать новый вопрос, если у вас возникнут дополнительные вопросы, я постараюсь объяснить вам там.
Мы не можем прочитать эти изображения. Пожалуйста, не размещайте изображения технической информации.