Перенести репозиторий в AccountController

#c# #asp.net-mvc

#c# #asp.net-mvc

Вопрос:

Я новичок в MVC и C # и застрял на этой ошибке. Я не знаю, как это исправить. Любая помощь была бы оценена.

Я пытаюсь перенести репозиторий customer в AccountController, чтобы при создании пользователя вы могли связать его с клиентом из выпадающего списка в представлении register user.

Я получаю ошибку в этой строке в моем контроллере.

 public AccountController()
        : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
    {
    }
  

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

     public AccountController(UserManager<ApplicationUser> userManager, ICustomerRepository customerRepository)
    {
        UserManager = userManager;
        customerrepository = customerRepository;
    }
  

Спасибо

Ответ №1:

У вас есть 2 конструктора в AccountController .

1-й вызывает 2-й.

Второй ожидает 2 параметра: a UserManager<ApplicationUser> и an ICustomerRepository .

Это ошибка, потому что вы передаете только одну вещь из 1-го во 2-й.

Вам нужно передать другой параметр во 2-й конструктор.

т. е. предполагаю, что вы хотели сделать что-то подобное:

 public AccountController()
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())),
           new CustomerRepository())
{
}
  

Комментарии:

1. Этот метод не позволит создать абстрактный класс или интерфейс, ICustomerRepository

2. Я не говорил о новом интерфейсе, вы бы создали новый класс, производный от этого интерфейса.

3. Мои извинения. Я неправильно понял. Это решило проблему, с которой я столкнулся. Я попытался обновить репозиторий, а не базовый класс. Спасибо.

Ответ №2:

Похоже, у вас есть только один конструктор:

 public AccountController
{
    UserManager<ApplicationUser> _manager ;

    public AccountController()
    {
        this._manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
    }

}
  

Вы должны использовать только : this(xxx) , когда существует более одного конструктора, и вы не хотите дублировать код между конструкторами.

 public AccountController
{
    UserManager<ApplicationUser> _manager ;

    public AccountController()
        :this(new ApplicationDbContext()) //calls the other constructor with a default context
    {
    }

    public AccountController(ApplicationDbContext context)
    {
        this._manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context);
    }

}
  

Ответ №3:

Похоже, вам нужно указать аргумент для параметра CustomerRepository в вашем конструкторе AccountController.

Возможно, лучшим решением было бы создать свойства в вашем контроллере, которые могут генерировать эти свойства, если они не указаны в конструкторе:

  • Получить user manager из OwinContext и
  • Создайте новый экземпляр вашего CustomerRepository

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

 private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager {
    get {
        return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
    }
    private set {
        _userManager = value;
    }
}