0

Этот человек сводит меня с ума. Я прочитал документы Ninject, я прочитал документы для расширения Ninject MVC, я потерял счетчик количества связанных вопросов SO, которые я прочитал, и я понятия не имею, где проблема с моим кодом.Проблемы с интеграцией Ninject

Я создаю webapp в ASP.NET MVC 4, и я использую Ninject для связывания интерфейсов репозитория. Документы говорят, что если вы добавите Ninject с помощью NuGet (что я и сделал), то он проложит все для вас, поэтому вам не нужно наследовать приложение от NinjectHttpApplication (так что я этого не сделал), и вам просто нужно добавить свой привязки в NinjectWebCommon.RegisterServices(), (которые у меня есть). У меня есть IRepository<T> и Repository<T>. В пользовательском репозитории есть несколько дополнительных методов для входа и регистрации, поэтому есть отдельный UserRepository, который реализует IRepository<User>. Мои привязки поэтому выглядеть следующим образом:

kernel.Bind(typeof(IRepository<>)).To(typeof(BaseRepository<>)).InRequestScope(); 
kernel.Bind(typeof(IRepository<User>)).To(typeof(UserRepository)).InRequestScope(); 

Документов и пару SO вопросов, также отметить, что если вы добавили Ninject хотя NuGet (что я и сделал), то он перебирает контроллер завод для вас и вы не Не нужно внедрять собственную фабрику контроллера Ninject-y (так что я ее не знаю). Мои контроллеры наследуют от BaseController, который имеет конструктор, который принимает набор IRepository-совместимых репозиториев. Теперь, из того, что я прочитал, когда я пытаюсь использовать контроллер, Ninject должен распознать параметры IRepositoriy и предоставить их. Это не так. Даже если я поместил атрибут [Inject] в конструктор, он все равно проигнорируется - вместо этого вызывается конструктор без параметров. Если я удалю конструктор без параметров, я получаю ошибку компиляции, жалуясь, что ее нет.

Что я пропустил? Как я могу получить Ninject для предоставления своих репозиториев?

ответ

2

Странно, я неспособен воспроизвести проблему, которую вы описываете.

Шаги:

  1. Создать новый ASP.NET MVC 4 приложения с использованием шаблона Интернет
  2. Установите Ninject.MVC3 NuGet
  3. Определить некоторые классы:

    public interface IRepository<T> 
    { 
    } 
    
    public abstract class BaseRepository<T> : IRepository<T> 
    { 
    } 
    
    public class User 
    { 
    } 
    
    public class UserRepository : BaseRepository<User> 
    { 
    } 
    
    public abstract class BaseController<T>: Controller 
    { 
        protected BaseController(IRepository<T> repository) 
        { 
         this.Repository = repository; 
        } 
    
        protected IRepository<T> Repository { get; private set; } 
    } 
    
    public class HomeController : BaseController<User> 
    { 
        public HomeController(IRepository<User> repository): base(repository) 
        { 
        } 
    
        public ActionResult Index() 
        { 
         return Content(this.Repository.GetType().ToString()); 
        } 
    } 
    
  4. и провод их в ~/App_Start/NinjectWebCommon.cs:

    private static void RegisterServices(IKernel kernel) 
    { 
        kernel 
         .Bind(typeof(IRepository<User>)) 
         .To(typeof(UserRepository)) 
         .InRequestScope(); 
    }   
    
  5. Запуск приложения, а соответствующий экземпляр хранилища вводится в HomeContorller.

+0

Huh. Я только начал этот проект, поэтому я начинаю задаваться вопросом, будет ли меньше работать, чтобы начать ... – anaximander

+0

Да, начните сначала. Мне потребовалось меньше минуты, чтобы издеваться над этим образцом. –

+0

Ну ... не уверен, что это считается «решением», рассматривающим проблему как-то не существует, но это объясняет в приятной кратким постом процесс, который мне пришлось собрать из неопределенных и/или странно написанных документов, поэтому вы получить согласие: P – anaximander

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