#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. Как насчет службы локализации или конфигурации, которая содержит только текст? Технически они все еще тупые