2014-01-23 2 views
0

В 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 знать, какой конструктор вызвать?

+0

У меня нет конкретного решения на верхней части моей головы, но вам нужно заменить код, который создает контроллеры при использовании инъекции зависимостей любого вида. Обычно вам придется реализовать свой собственный (простой) контроллер, который будет вводить нужные вам зависимости. Заводская установка по умолчанию потребует меньше конструкторов с параметрами Вы также можете перейти от 'DefaultControllerFactory' (см. Msdn: http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory(v=vs .118) .aspx) и разрешите ваши зависимости там. Затем зарегистрируйте новую фабрику в MVC5. – Tseng

+0

. Вы можете установить новый контроллер с помощью 'ControllerBuilder.SetControllerFactory' (ссылка: http://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbuilder.setcontrollerfactory (v = vs.118) .aspx). Надеюсь, это поможет – Tseng

+0

И fwiw: Не создавайте 'UserManager' внутри конструктора, это делает ваш класс не UnitTest-способным. Внедрите UserManager в качестве интерфейса и передайте 'IUserManager' как только зависимость от класса и разрешите его с помощью вашей инфраструктуры DI – Tseng

ответ

5

Вам нужен DependencyResolver зарегистрированный в Global.asax.cs

Регистрация будет выглядеть примерно так:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
    RegisterDependencyResolver(); 
} 

private void RegisterDependencyResolver() 
{ 
    var kernel = new StandardKernel(); 

    // you may need to configure your container here? 
    RegisterServices(kernel); 

    DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); 
} 

И DependencyResolver

+0

umm извините, это может показаться глупым, но, сконфигурировав мой контейнер, вы meaan свяжетесь с репозиторией Irepository и где это RegisterServices, исходящее из ? – Cybercop

+0

это сработало спасибо !!! – Cybercop

+3

Вам не нужно катить собственный DependencyResolver - он предоставляется пакетом Ninject.Mvc3 (он также работает с MVC4 и 5). – Sam

2

Это обновление: Если вы используете MVC5 и WebAPI 2, тогда все, что вам нужно сделать, это использовать NuGet Manager и добавить NinjectMVC5 и NinjectWebA pi2 в ваш проект. Затем ошибка исчезает. (С помощью Visual Studio 2013)

Приветствия

+1

Это ничего не решило – MikeV

+0

Вам понадобятся 'Ninject.Web.WebApi' и' Ninject.Web.WebApi.WebHost' из nuget или пакет OwinHost. См. Http://stackoverflow.com/a/22774893/982237 – obsoleter

+0

Не сделал ничего для меня. Я снова попробовал пакет MVC5, но я не вижу, что он добавляет или как вы его используете (не имеет значения). Мне пришлось прибегнуть к приведенному выше примеру qujck (https://stackoverflow.com/a/21313049/4826364) –

Смежные вопросы