Фреймворки приложений - купить, построить или ассимилировать?
Мне было любопытно, что другие магазины делают в отношении базовых структур приложений? Я рассматриваю каркас приложений как способный предоставить дополнительную или расширенную функциональность для улучшения качества приложений, созданных на его основе.
Существует множество готовых фреймворков, таких как Spring (или Spring.NET) и т. Д. Я считаю, что самая большая проблема заключается в том, что они не порционные. По сути, они имеют слишком много функциональных возможностей, и, если каждая из этих функций не является наилучшей доступной реализацией, есть вероятность, что вы в конечном итоге будете использовать лоскутное устройство из нескольких платформ для выполнения этих задач - что приведет к раздутию и путанице. Это касается свободных и коммерческих систем, на мой взгляд.
Конечно, письмо в значительной степени заново изобретает колесо. Однако я не думаю, что это бесполезно, поскольку предоставляет наиболее настраиваемый вариант. Однако некоторые вещи слишком велики для разработки и в этом случае кажутся плохо реализованными или не реализованными вообще из-за нерешительности брать на себя первоначальные затраты на разработку.
Существует большое разнообразие проектов с открытым исходным кодом, которые также затрагивают отдельные части возможной прикладной среды. Они могут быть приняты или ассимилированы (очевидно, в зависимости от лицензионных соглашений), чтобы помочь создать всеобъемлющую структуру из различных источников.
Мы подошли к ситуации, взглянув на некоторые большие проблемы в наших приложениях по всему предприятию, и составили список действительных сквозных проблем и повторяющихся проблем внедрения. В итоге мы пришли к гибридному решению, которое является частично открытым исходным кодом, частично основанным на существующих опциях с открытым исходным кодом и частично разработанным на заказ.
Несколько примеров вещей, которые есть в нашей структуре:
- Поставщики исключений и регистрации событий. Простое унифицированное средство, с помощью которого каждое приложение может регистрировать исключения и события идентичным образом с минимальными усилиями по написанию кода. Из коробки он может регистрироваться на SQL Server, в текстовом файле, в средстве просмотра событий и т. Д. Он также содержит точки расширения для входа в другие источники.
- Обеспечение присваивания переменных. Универсальный класс, который предоставляет методы расширения, основанные на типе объекта, используя синтаксис, вдохновленный JUnit. Например, чтобы определить, является ли myObject ненулевым, мы можем сделать простой Enforce.That(myObject).IsNotNull(); или определите, является ли это конкретным типом, выполнив простой Enforce.That(myObject).IsOfType(typeof(Hashtable)); Сбои принудительного применения приводят к возникновению соответствующего исключения, что сокращает объем кода и обеспечивает согласованность реализации.
- Помощники юнит тестирования. Серия классов, основанная на рефлексии, которая может автоматически тестировать классы и их свойства. (Вдохновлено автоматическим тестером классов из CodePlex), но написано с нуля. Помогает упростить создание модульных тестов для вещей, которые традиционно трудны или требуют много времени для тестирования.
Мы также приняли некоторые другие функции, как есть. Например, мы используем PostSharp для AOP, moq для насмешки и autofaq для DI.
Просто интересно, что могли бы сделать другие люди и что касается адресов вашей платформы, которые вы не нашли инструментария, который вас удовлетворил? Что касается нашего опыта, мы определенно пожинаем преимущества новой структуры и довольны принятым нами подходом.
2 ответа
Наш подход состоял в том, чтобы посвятить целую команду архитекторов (а именно " технических архитекторов") для:
- либо адаптировать существующую платформу с открытым исходным кодом, в некоторых случаях инкапсулируя их во внутренний API, чтобы иметь возможность изменить платформу в случае необходимости
- или создание новой структуры, основанной на конкретных потребностях, найденных несколькими командами для нескольких проектов.
Безотносительно подхода эти структуры должны быть очень хорошо документированы (по крайней мере, с полным публичным API), и их выпуск должен быть хорошо прорекламирован:
Поскольку все команды будут основывать свою работу на этих платформах, им необходимо как можно скорее обновить свои версии инфраструктуры, чтобы создавать свои собственные поставки.
Мой простой совет заключается в том, что вы используете структуру, которая соответствует вашим потребностям. Конечно, чтобы сделать это, вам нужно поэкспериментировать и заранее знать, что вы ищете. Даже если фреймворк содержит гораздо больше, чем нужно, какова стоимость этого? Для средней проблемы стоимость составляет всего несколько дополнительных мегабайт в банке, что, я думаю, нормально для большинства проектов.
В конце концов, вы должны выбрать среду, которая делает свою работу правильно, так что вы должны сосредоточиться на предоставлении пользовательской ценности и упрощении обслуживания разработчика. Конечно, нет единой платформы, которая бы решала проблемы каждого, но есть некоторые структуры, которые попадают в точку, к которой они стремятся. Все дело в том, чтобы идти с лучшим компромиссом.