Я использую шаблон 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);
}
}
Начну с переименования StusentService в StudentService.
Вам необходимо создать интерфейс StudentService, а в вашем контроллере использовать этот интерфейс и использовать DI для разрешения зависимости StudentService,





Я решил проблему:
Студенческий модуль
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);
}
}
Кажется, проблема с объявлением внедрения зависимостей, вы можете это проверить?