Внедрение зависимостей MVC, Ninject

171
18 сентября 2019, 14:30

Есть две модели:

public class Course
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CourseId { get; set; }
    [Required(ErrorMessage = "Обязательно для заполнения")]
    [Display(Name = "Название курса")]
    public string Title { get; set; }

    [Required(ErrorMessage = "Обязательно для заполнения")]
    [Display(Name = "Описание курса")]
    public string Description { get; set; }
    [Required(ErrorMessage = "Обязательно для заполнения")]
    [Display(Name = "Стоимость курса")]
    public decimal Price { get; set; }
    //Configure 1 to many and NavigationProperty
    //foreighn key
    public int? CurrentTeacherId { get; set; }
    public Teacher Teacher { get; set; }
}
public class Teacher
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int TeacherId { get; set; }

    [Required(ErrorMessage = "Обязательно для заполнения")]
    [Display(Name = "Имя")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Обязательно для заполнения")]
    [Display(Name = "Отчество")]
    public string MiddleName { get; set; }

    [Required(ErrorMessage = "Обязательно для заполнения")]
    [Display(Name = "Фамилия")]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Обязательно для заполнения")]
    [Display(Name = "Опыт")]
    public int Expirience { get; set; }
    public List<Course> Courses { get; set; }
}

Я реализовал обобщённый интерфейс

public interface IRepository<T> where T:class
{
    void Add(T item);
    void Update(int id, T Item);
    List<T> GetAllRecords();
    T GetById(int id);
}

Переопределил методы

public class BaseRepository<TEntity> : IRepository<TEntity> where TEntity : class
{
    protected DataContext Context;
    public BaseRepository(DataContext dataContext)
    {
        Context = dataContext;
    }
    public void Add(TEntity item)
    {
        Context.Set<TEntity>().Add(item);
        Context.SaveChanges();
    }
    public List<TEntity> GetAllRecords()
    {
        return Context.Set<TEntity>().ToList();
    }
    public TEntity GetById(int id)
    {
        return Context.Set<TEntity>().Find(id);
    }
    public void Update(TEntity Item)
    {
        Context.Entry(Item).State = EntityState.Modified;
        Context.SaveChanges();
    }
}

Создал ещё один класс, в котором добавил 2 интерфейса ICourseRepository, ITeacherRepository (т.е. в них расширяем наши интерфейсы методами). И соответственно класс CourseRepository

public interface ICourseRepository : IRepository<Course>
{
    //List<Course> GetCoursesByTeacherId(int teacherid);
}
public interface ITeacherRepository : IRepository<Teacher>
{
}
public class CourseRepository : BaseRepository<Course>, ICourseRepository
{
    private readonly DataContext _dataContext;
    private ICourseRepository _courseRepository;
    //private readonly ITeacherREpository _teacherREpository;
    //ITeacherREpository teacherREpository
    public CourseRepository(DataContext dataContext, CourseRepository courseRepository) : base(dataContext)
    {
        _dataContext = dataContext;
        _courseRepository = courseRepository;
        //_teacherREpository = teacherREpository;
    }
    //public List<Course> GetCoursesByTeacherId(int teacherid)
    //{
    //    Teacher teacher = _teacherREpository.Find(p => p.TeacherId == teacherid);
    //    if (teacher != null)
    //    {
    //        List<Course> asd = _dataContext.Courses.Where(p => p.Teacher.TeacherId == teacher.TeacherId).AsNoTracking().ToList();
    //    }
    //    throw new NotImplementedException();
    //}
}

Как я теперь могу использовать весь функционал для методов в контроллере, и использовать Ninject. Здесь как то я застрял. В контроллере написал след. код.

IRepository<Course> repository;
    public HomeController(IRepository<Course> _repository)
    {
        repository = _repository;
        IKernel kernel = new StandardKernel();
        kernel.Bind<ICourseRepository>().To<CourseRepository>();
        repository = kernel.Get<ICourseRepository>();
    }

Но выдаёт ошибку.

Answer 1

проблема заключалась в регистрации зависимостей в Global.Asax файле. как и ответил tym32167. (у меня они не были зарегистрированы), данный код для обобщённых интерфейсов (ниже). мои действия:

NinjectModule module = new NinjectRegistrations();
var kernel = new StandardKernel(module);
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));

В global.asax файле

NinjectModule module = new NinjectRegistrations();
var kernel = new StandardKernel(module);
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));

И в контроллере:

public class HomeController : Controller
{
    IRepository<Course> repository;
    public HomeController(IRepository<Course> _repository)
    {
        repository = _repository;
    }
    public ActionResult GetAllCourses()
    {
        return View(repository.GetAllRecords());
    }
}
READ ALSO
Как привязать к строчкам ListBox свои данные?

Как привязать к строчкам ListBox свои данные?

Как привязать к строчкам ListBox свои данные? Например, какой-нить свой класс DataRec?

110
Какие классы в C# нельзя наследовать?

Какие классы в C# нельзя наследовать?

Запечатанные классы точно нельзя наследоватьЕсть ли еще какие-то варианты?

138
Работа с Epub при помощи EpubSharp C#

Работа с Epub при помощи EpubSharp C#

Использую бибиблиотеку EpubSharp для того, чтобы сохранить имеющийся текст в форматеepub

121