Ошибки с UnitOfWork в asp.net mvc

Я использую шаблон UnitOfWork в своем проекте mvc5.

У меня есть слой BLL со службами.

 public class StudentService
    {
        private readonly IUnitOfWork _db;

        public StudentService(IUnitOfWork uow)
        {
            _db = uow;
        }

        public IEnumerable<StudentView> GetStudentViews()
        {
            List<Student> students = _db.Students.GetAll().ToList();
            return Mapper.Map<List<Student>, List<StudentView>>(students);
        }
}

Но когда я пытаюсь использовать эту службу в контроллере mvc, у меня появляется ошибка: «Для этого объекта не определен конструктор без параметров».

public class StudentController : Controller
    {
        private readonly StudentService _service;

        public StudentController(StudentService service)
        {
            _service = service;
        }

        // GET: Student
        public ActionResult Index()
        {
            IEnumerable<StudentView> studentViews = _service.GetStudentViews();
            return View("Index", studentViews);
        }
}

У меня нет конструктора без параметров, но как я могу использовать свою службу с конструктором без параметров в контроллере?

Я использую DI для UnitOf Work:

 public class ServiceModule : NinjectModule
    {
        private string connection;
        public ServiceModule(string connection)
        {
            this.connection = connection;
        }

        public override void Load()
        {
            Bind<IUnitOfWork>().To<UnitOfWork>().WithConstructorArgument(connection);
        }
    }

Кажется, проблема с объявлением внедрения зависимостей, вы можете это проверить?

user1672994 01.05.2018 10:31

Начну с переименования StusentService в StudentService.

Tanveer Badar 01.05.2018 10:32

Вам необходимо создать интерфейс StudentService, а в вашем контроллере использовать этот интерфейс и использовать DI для разрешения зависимости StudentService,

Saadi 01.05.2018 10:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
114
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я решил проблему:

Студенческий модуль

public class StudentModule : NinjectModule
    {
        public override void Load()
        {
            Bind<IStudentService>().To<StudentService>();
        }
    }
}

Global.asax:

 public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
           ///

            //dependencies
            NinjectModule serviceModule = new ServiceModule("connection");
            NinjectModule studentModule = new StudentModule();
            var kernel = new StandardKernel(studentModule, serviceModule);
            DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
        }
    }
Ответ принят как подходящий

«Для этого объекта не определен конструктор без параметров».

Это сообщение означает, что вы забыли зарегистрировать зависимость для StudentService. Вот почему он проигнорировал конструктор

public StudentController(StudentService service)
        {
            _service = service;
        }

а затем он начал искать другой конструктор, который является конструктором без параметров.

Я предлагаю создать интерфейс IStudentService.

public class IStudentService

и сделать StudentService реализует IStudentService

public class StudentService: IStudentService

Затем в вашем ServiceModule

public class ServiceModule : NinjectModule
    {
        private string connection;
        public ServiceModule(string connection)
        {
            this.connection = connection;
        }

        public override void Load()
        {
            Bind<IUnitOfWork>().To<UnitOfWork>().WithConstructorArgument(connection);
            Bind<IStudentService>().To<StudentService>();
        }
    }

Эта ошибка не связана с UnitOfWork. Это происходит из-за вашего контроллера StudentController и проверяет конструктор этого контроллера.

public StudentController(StudentService service)

Вашему контроллеру требуется экземпляр StudentService, и вы не регистрируете никакой зависимости для этого класса StudentService. Контроллер Asp.Net MVC не требует конструктора параметров или, если у вас есть какая-либо зависимость, ее необходимо разрешить до создания контроллера.

Решение - сделать Интерфейс для класса StudentService.

public interface IStudentService
{
     IEnumerable<StudentView> GetStudentViews();
}

и обновите свой класс StudentService, чтобы реализовать этот интерфейс

public class StudentService : IStudentService
{
    private readonly IUnitOfWork _db;

    public StudentService(IUnitOfWork uow)
    {
        _db = uow;
    }

    public IEnumerable<StudentView> GetStudentViews()
    {
        List<Student> students = _db.Students.GetAll().ToList();
        return Mapper.Map<List<Student>, List<StudentView>>(students);
    }
}

Обновите свой регистрационный код DI, чтобы зарегистрировать эту зависимость.

public class ServiceModule : NinjectModule
    {
        private string connection;
        public ServiceModule(string connection)
        {
            this.connection = connection;
        }

        public override void Load()
        {
            Bind<IUnitOfWork>().To<UnitOfWork>().WithConstructorArgument(connection);
            Bind<IStudentService>().To<StudentService>();
        }
    }

Обновите свой StudentController и используйте IStudentService вместо StudentService.

public class StudentController : Controller
    {
        private readonly IStudentService _service;

        public StudentController(IStudentService service)
        {
            _service = service;
        }

        // GET: Student
        public ActionResult Index()
        {
            IEnumerable<StudentView> studentViews = _service.GetStudentViews();
            return View("Index", studentViews);
        }
}

Другие вопросы по теме