Внедрение зависимости в настраиваемый ModelBinder

В настоящий момент у меня работает проект ASP.net MVC, и мне интересно, возможно ли следующее: у меня есть собственный класс ModelBinder, который имеет ссылку на службу (по сути, сборщик) в качестве зависимости. Я хочу, чтобы зависимость была введена с использованием контейнера IoC (в настоящее время Ninject), но, похоже, в цепочке методов нет места, куда я мог бы подключить что-то, что говорит о загрузке связывателя модели из моего контейнера IoC.

Моя первая мысль состоит в том, чтобы иметь общий связыватель объектов, который затем пытается получить конкретный объект ModelBinder из контейнера, возвращая null, если он не найден, а затем ставит его в качестве связующего, то есть что-то вроде: ModelBinders.Binders.Add (typeof (object ), typeof (NinjectModelBinder));

но я не уверен

  • а) если это сработает
  • б) если это действительно правильно

Я мог бы отказаться от разрешения сложного объекта до использования метода Action, но было бы чище и желательнее иметь возможность предоставить сложный объект (который, по сути, загружается и строится из уровня доступа к данным) в качестве параметра действия.

Любые мысли / помощь приветствуются.


person buildmaster    schedule 23.02.2009    source источник
comment
Я лично считаю, что ModelBinders, созданные с помощью ModelBinderAttribute, тоже должны быть инъекционными. Я думаю, что это недостаток дизайна текущей версии MVC.   -  person CVertex    schedule 12.09.2009


Ответы (3)


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

    ModelBinders.Binders.Add(typeof(Customer), Resolve<CustomerBinder>());
person Matt Hinze    schedule 24.02.2009
comment
Да, я подумал, что это может быть так. - person buildmaster; 24.02.2009

Я лично использую сеттер-инъекцию в моем сценарии, аналогичном вашему. После поиска NInject вызывает это свойство инъекцией. Он работает и выполняет свою работу.

person Ben Robbins    schedule 24.02.2009

Внутри привязки моделей вы можете назвать что-то вроде этого

IMyFetcher db = DependencyResolver.Current.GetService<IMyFetcher>();
person Iridio    schedule 02.04.2012