ASP.Net MVC Контроллер впрыска - PullRequest
       3

ASP.Net MVC Контроллер впрыска

4 голосов
/ 04 октября 2011

Я ищу предложения о хороших способах разработки нового проекта ASP.NET Mvc.Он среднего размера и относительно прост по своей структуре.Сначала я использовал Spring.Net, чтобы связать свои сервисные объекты с правильными конструкторами, но теперь руководство сообщило мне, что Spring.Net или любой другой контейнер IOC нельзя использовать в нашей среде.

У меня возникли проблемы с поиском хорошего способа настройки без DI.Я хотел бы иметь возможность назначать реализации сервисов для контроллеров таким образом, чтобы обеспечить низкую степень связи между контроллерами и сервисами и максимально ограничить надежность контроллеров в отдельных реализациях сервисов.Я предполагаю, что мой вопрос сводится к тому факту, что я не уверен, куда мне следует вручную подключить свое приложение в модели MVC.

Ответы [ 5 ]

5 голосов
/ 04 октября 2011

Поскольку вы используете ASP.NET MVC 3, вы можете написать пользовательский преобразователь зависимостей .Конечно, вы все равно будете проектировать свои контроллеры, используя интерфейсы в своих конструкторах, чтобы ослабить связь между слоями.А затем в пользовательском средстве разрешения зависимостей, чтобы удовлетворить нелепое требование, которое вам было навязано, вам придется вручную сказать, что когда у вас есть ISomeService, вы возвращаете экземпляр SomeServiceImpl.Знаете, такие вещи, которые объектные контейнеры и DI-фреймворки уже делают для вас.Таким образом, вам придется изобретать некоторые колеса.Кстати, Ayende написал о том, как можно построить собственный контейнер IoC из 15 строк кода , но, конечно, это не причина, по которой вы должны когда-либо делать что-то подобное.

Люди, навязывающие такиетребования должны предстать перед судом и быть осуждены, чтобы никогда не подходить к дизайну приложения.Введение такого требования иллюстрирует полное отсутствие знаний о передовых методах проектирования приложений.Эти люди должны быть проинформированы, прежде чем они нанесут дальнейший ущерб компании.

Поэтому просто объясните тем людям, что при повторном изобретении колес есть две ошибки:

  • вы потратите много временичто-то, что уже было сделано кем-то другим
  • , вы допустите ошибки, поскольку не будете принимать во внимание все крайние случаи, которые были приняты во внимание кем-то еще, проектирующим структуру многократного использования DI.

В конце дня вы отправите свое приложение с опозданием по графику (как вы бы потратили впустую время на написание сантехнического кода) и, что еще хуже, вы отправите приложение, которое будет содержать возможные ошибки.

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

Заключение2: используйте существующую структуру DI.Руководство даже не заметит, поскольку, похоже, не понимает технических аспектов приложения, навязывая такие требования.

4 голосов
/ 04 октября 2011

Прежде всего, я хотел бы спросить, почему руководство обязало вас не использовать шаблон и инструменты, которые позволили бы вам добиться слабой связи и внедрения зависимостей. Об этом можно говорить и рассуждать?

В контейнере IoC тривиально реализовать IControllerFactory, который разрешает контроллеры из контейнера и внедряет необходимые службы.

В MVC 3 есть IDependencyResolver, который можно использовать для достижения более слабой связи (через шаблон / анти-шаблон Service Locator), чем создание сервисов непосредственно внутри контроллеров; этот интерфейс был спроектирован для использования с контейнером IoC, хотя на самом деле и будет более плохой заменой сам по себе.

0 голосов
/ 05 октября 2011

Вам нужен новый дом. Существует множество организаций, которые ищут талантливых инженеров, которые заботятся о качестве и масштабируемой архитектуре. Убедитесь, что вы нашли правильный вариант, и они будут рады найти вас.

Избегайте соблазна спасти свою нынешнюю команду от собственной близорукости. Судя по твоим описаниям, похоже, что ты уже изгоем, несмотря на свои таланты. Примите тот факт, что вас не будут слушать.

Лучшая стратегия - притворяться рожденным заново командным игроком. Создайте свой проект MVC точно так, как просил ваш босс, то есть тупой путь, без разделения интересов. Когда версия 1 вашего проекта закончена и проходит QA (если у вас есть QA), ваш босс, вероятно, подумает, что он оправдан. Будьте готовы к этой реакции.

Лучшая надежда на то, что вы просвещаете своих нынешних членов команды, - это показать им, что даже если вы создаете программное обеспечение, используя те же самые тупые методы, с которыми им удобно, вы все равно можете обойти их. Это может быть весело. Затем, когда вы уходите, вы даете им возможность подумать о том, что вы что-то хотели. Они могут либо воспользоваться этим шансом, либо выбрать дополнительный комфорт, но это больше не будет вашей проблемой.

0 голосов
/ 05 октября 2011

руководство сообщило мне, что Spring.Net или любой другой контейнер IOC не использовать в нашей среде.

Руководство говорит вам, что вам не разрешено писать слабосвязанные, тестируемые и легко обслуживаемые приложения, вот что они говорят вам. Это странное ограничение.

Внедрение зависимостей - это передовая технология, которую многие разработчики не понимают. Однако руководство никогда не поймет этого, и это не их задача - понять это. Они могут диктовать тип технологии (например, .NET против Java), потому что это влияет на то, какой персонал им нужно нанять, но когда они начинают диктовать детали реализации на низком уровне, которые мешают вам писать спускаемое программное обеспечение, ваша компания движется к катастрофе.

Выйти из этой компании сейчас можно!

Другой вариант - использование исходного кода простого инжектора . База кода достаточно мала (около 500 строк, просто используйте проект SimpleInjector.NET), чтобы можно было скопировать его в локальный проект (и лицензия это позволяет). Таким образом, это ваш собственный локальный DI-контейнер, но полностью протестированный: -)

Удачи.

0 голосов
/ 05 октября 2011

У вашего босса заостренные волосы?http://www.dilbert.com/

Вы можете сэкономить некоторое время, используя http://unitymvc3.codeplex.com/ вместо написания собственного пользовательского средства разрешения зависимостей.Его можно загрузить через Nuget http://nuget.org/. Если вы используете такой контейнер IOC и используете инжектор конструктора, вы обнаружите, что ваши модульные тесты гораздо проще писать.Это при условии, что ваш менеджер верит в юнит-тестирование ;-) Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...