2016-10-20 5 views
4

Я пытаюсь изучить MVC, и я начал с книги Про ASP.NET MVC от Адама Фримана (5-е издание - 2013).Нет соответствующих привязок, и тип не является самопереключаемым. Ошибка активации IProductsRepository

В главе VII я пытаюсь следовать примеру в книге, создавая небольшое приложение.

Приложение не загружается после его настройки и пытается загрузить список продуктов.

Я пытаюсь создать макет реализацию абстрактного хранилища IProductRepository и имеют Ninject вернуть фиктивный объект всякий раз, когда он получает запрос на реализацию интерфейса IProductRepository.

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

public static class NinjectWebCommon 
    { 
     private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
      bootstrapper.Initialize(CreateKernel); 
     } 

     /// <summary> 
     /// Stops the application. 
     /// </summary> 
     public static void Stop() 
     { 
      bootstrapper.ShutDown(); 
     } 

     /// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     private static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

      RegisterServices(kernel); 
      return kernel; 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
      DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); 
     }   
    } 
} 

Следующий мой NinjectDependencyResolver класс:

public class NinjectDependencyResolver : IDependencyResolver 
    { 

     private IKernel kernel; 

     [Inject] 
     public NinjectDependencyResolver(IKernel kernelParam) 
     { 
      kernel = kernelParam; 
      AddBindings(); 
     } 


     public object GetService(Type serviceType) 
     { 
      return kernel.TryGet(serviceType); 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      return kernel.GetAll(serviceType); 
     } 


     private void AddBindings() 
     { 
      var mock = new Mock<IProductsRepository>(); 

      mock.Setup(m => m.Products).Returns(new List<Product> 
      { 
       new Product { Name = "Fotball", Price = 25 }, 
       new Product { Name = "Surf Board", Price = 45 }, 
       new Product { Name = "Running Shoes", Price = 95 } 
      }); 

      kernel.Bind<IProductsRepository>().ToConstant(mock.Object); 
     } 
    } 

И это мой класс контроллера:

public class ProductController : Controller 
{ 


    private IProductsRepository repository; 



    public ProductController(IProductsRepository productRepository) 
    { 
     repository = productRepository; 
    } 



    public ViewResult List() 
    { 
     return View(repository.Products); 
    } 

Ошибки я получаю следующее: активирующий

Ошибка IProductsRepository
Нет соответствующих привязок, и тип не является самопереключаемым.
Путь активации:
2) Инъекция зависимости IProductsRepository в параметре productRepository конструктора типа ProductController.
1) Запрос на контроль продукта.
Предложения:
1) Убедитесь, что вы определили привязку для IProductsRepository.
2) Если привязка была определена в модуле, убедитесь, что модуль загружен в ядро.
3) Убедитесь, что вы случайно не создали более одного ядра.
4) Если вы используете аргументы конструктора, убедитесь, что имя параметра соответствует имени параметра конструктора.
5) Если вы используете автоматическую загрузку модуля, убедитесь, что путь поиска и фильтры правильные.

ответ

1

ОК, так что кажется, что у меня была другая ошибка, в котором говорилось:

Найденные конфликты между разными версиями одного и того же зависимую сборку, которая не может быть решена

Я установил конкретные версии Ninject, Ninject.Web.Common, Ninject.MVC3, Moq и другие пакеты, как указано автором книги.

После прочтения ошибки в выходе сборки я попытался обновить все установленные пакеты до последних версий, перестроить проект, и все это сработало просто отлично!

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

  • Нет связанных вопросов^_^