Я работаю на контроллерах, но не на модели - PullRequest
5 голосов
/ 18 ноября 2011

Привет, я использую ninject с приложением MVC.

Я уверен, что он настроен правильно, так как я могу заставить его работать для моих контроллеров. Вот пример для контроллера, и он работает правильно:

public class GstRateController : Controller
    {
        private readonly IUnitOfWork _unitOfWork;

        public GstRateController(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }
...

Тогда я подумал, что это будет хорошо для viewModel, поэтому я попробовал это с:

public class SettingController : Controller
    {
        private readonly IUnitOfWork _unitOfWork;

        public SettingController(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }

Итак, я создал экземпляр модели представления в контроллере:

public ActionResult Index()
        {
            return View("Index", Activator.CreateInstance<SettingViewModel>());
        }

Но это дает мне ошибку:

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

Я новичок в DI. Может кто-нибудь сказать, пожалуйста, как этого добиться для viewmodels?

1 Ответ

4 голосов
/ 18 ноября 2011

Причина, по которой он работает для контроллеров, а не для просмотра моделей, заключается в том, что при установке NInject NuGet он регистрирует настраиваемый преобразователь зависимостей, а среда ASP.NET MVC использует либо фабрику контроллеров, либо преобразователь зависимостей для создания экземпляров контроллеров. Подробнее о средствах разрешения зависимостей вы можете прочитать в этой статье .

С другой стороны, модели представлений - это классы, которые вы специально разработали для удовлетворения требований данного представления. Поскольку вы создаете их вручную, структура DI никогда не сможет перехватить и внедрить в них какие-либо зависимости. У них не должно быть зависимостей. Они должны быть простыми объектами POCO, которые сопоставлены с моделями доменов. Они представляют проект одной или нескольких моделей доменов.

...