Можете ли вы внедрить зависимости в конструктор пользовательской WebViewPage, используя контейнер IOC?

#asp.net-mvc #dependency-injection #inversion-of-control

#asp.net-mvc #внедрение зависимостей #инверсия управления

Вопрос:

Насколько я понимаю, в MVC 3 вы можете создавать пользовательские WebViewPages. Можете ли вы внедрить зависимости, используя внедрение конструктора, через контейнер IOC?

Ответ №1:

В сообщении в блоге Брэда Уилсона есть пример для внедрения представления http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.html

Утверждения других, что представления допускают внедрение конструктора, не совсем корректны. Да IDependencyResolver позволяет создавать представления с аргументами конструктора. Но если вы не реализуете свой собственный механизм просмотра, это вам вообще не поможет. Существующие механизмы просмотра, такие как razor, потребуют, чтобы у вас был конструктор без параметров. Это означает, что вы можете выполнять только внедрение свойств в представления с их помощью.

Но, как говорили другие, вы все равно не должны делать инъекцию просмотра. Ваше представление должно быть немым и просто отображать модель представления в HTML. Все, что требует зависимости, должно выполняться в контроллере или службе.

Комментарии:

1. Что делать, если у вас есть пользовательская авторизация, которую вы хотите использовать в качестве свойства представления? (чтобы указать определенные части, которые не должны отображаться в razor без необходимых разрешений)

Ответ №2:

Невозможно выполнить внедрение конструктора. Но вы можете сделать что-то подобное, скажем, с Ninject:

 общедоступный абстрактный класс CustomViewBase<tModel> : WebViewPage<tModel> где tModel : класс
 {
 [Внедрить]
 публичное лицо IFace
 {
получить;
 установить;
 }
 }

И предполагая, что вы настроили IDependencyResolver в Global.asax, вы должны правильно инициализировать свойство @Face. Но одно важное предостережение: вы не можете получить доступ к @Face в _Layout.cshtml, потому что (по словам Брэда Уилсона) Макет работает вне MVC, и @Face будет null при попытке получить к нему доступ на странице макета.

В любом случае я согласен с другими в том, что представление не должно иметь дело с какой-либо сложной логикой.

Комментарии:

1. ЭТО потрясающе! Я не знал, что вы можете сделать это с Ninject.

2. Также не обязательно должно быть Ninject . Autofac и другие будут делать то же самое, не требуя декоратора.

3. Это хорошо работало на унаследованных страницах. Но каково решение для доступа к тем же внедренным методам класса внутри layout (masterpage) в MVC

Ответ №3:

Да, это возможно, но я действительно думаю, что это не очень хорошая идея. Зачем вам нужны какие-то «сервисы» на уровне представления? Помните ключевое правило MVC — представление должно быть немым.На самом деле, это должен быть просто какой-то шаблон для преобразования объекта модели представления в HTML, не более того.

Комментарии:

1. Хороший момент. Он должен внедрять сервисы в Controller , а не в представление.

2. переводы i18n в представлении. Представление содержит ключи, и вы просто извлекаете правильный перевод. Нет причин, по которым этого не может быть в представлении.

3. Как насчет службы локализации или конфигурации, которая содержит только текст? Технически они все еще тупые