В MVC 5 мы получаем этот контроллер учетных записей, который выглядит следующим образом.MVC5 и Ninject: Ошибка конструктора без параметров
public class AccountController : Controller
{
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new DatePickerDbContext())))
{
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
}
Я установил Ninject для обработки моей инъекции зависимости. У меня есть два хранилища, что я хочу использовать в моей AccountController и код теперь выглядит как этот
public class AccountController : Controller
{
private readonly ILicenserepository _licenserepository;
private readonly IUserRepository _userRepository;
public AccountController(ILicenserepository licenserepository, IUserRepository userRepository)
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new DatePickerDbContext())))
{
_licenserepository = licenserepository;
_userRepository = userRepository;
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
}
в ninject.web.common это то, что я сделал
private static void RegisterServices(IKernel kernel)
{
kernel.Bind(typeof (ILicenserepository)).To(typeof (Licenserepository));
kernel.Bind(typeof (IUserRepository)).To(typeof (UserRepository));
}
но когда Я запускаю приложение, я получаю сообщение об ошибке в браузере, в котором говорится, что конструктор без параметров не найден. И если я создаю конструктор с меньшим конструктором, мои репозитории не получат экземпляр. Поэтому везде, где я вызывал метод из репозитория, значение равно null. Как я могу решить эту проблему? Или сделать MVC или Ninject знать, какой конструктор вызвать?
У меня нет конкретного решения на верхней части моей головы, но вам нужно заменить код, который создает контроллеры при использовании инъекции зависимостей любого вида. Обычно вам придется реализовать свой собственный (простой) контроллер, который будет вводить нужные вам зависимости. Заводская установка по умолчанию потребует меньше конструкторов с параметрами Вы также можете перейти от 'DefaultControllerFactory' (см. Msdn: http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory(v=vs .118) .aspx) и разрешите ваши зависимости там. Затем зарегистрируйте новую фабрику в MVC5. – Tseng
. Вы можете установить новый контроллер с помощью 'ControllerBuilder.SetControllerFactory' (ссылка: http://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbuilder.setcontrollerfactory (v = vs.118) .aspx). Надеюсь, это поможет – Tseng
И fwiw: Не создавайте 'UserManager' внутри конструктора, это делает ваш класс не UnitTest-способным. Внедрите UserManager в качестве интерфейса и передайте 'IUserManager' как только зависимость от класса и разрешите его с помощью вашей инфраструктуры DI – Tseng