Ошибки с UnitOfWork в asp.net MVC - PullRequest
0 голосов
/ 01 мая 2018

Я использую шаблон 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);
        }
    }

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

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

Это сообщение означает, что вы забыли зарегистрировать зависимость для 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>();
        }
    }
0 голосов
/ 01 мая 2018

Эта ошибка не связана с 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);
        }
}
0 голосов
/ 01 мая 2018

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

StudentModule

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));
        }
    }
...