5. История развития
XML + XSLT + Transformation script, Classic ASP, JS
Scriptlets, MS SQL, Stored Procedures, XSLT, Pre-
AJAX, ASP.NET, custom HttpHandler, custom XML-
based page renderer, Business Logic in Stored
Procs, XML from SQL Server, XSLT with extensions,
Utility Classes in C#, NHibernate, ObjectQuery
functionality, Automatic mapping Object – XML,
AJAX Backoffice, JS-web services, CRUD, Custom
Event Bus, DI Container (Unity), ASP.NET MVC…
6. Крупные модернизации
• Внедрение ORM
• Преобразование объектов в XML
• DI container
• Переходим на ASP.NET MVC
11. Unit tests не работают
https://picasaweb.google.com/lh/photo/bdJ2w6x9L1H7kUzDsDSyIg
12. Сложно развивать систему
http://sqlblog.com/blogs/merrill_aldrich/archive/2011/08/10/ouch-chasing-the-isv-or-that-code-makes-my-teeth-hurt-t-sql-tuesday-ish-21.aspx
26. Слишком много NHibernate
• За 5 лет проник повсеместно
• Конфигурируется «магически»
• Текущая сессия – в контексте запроса
• Все классы лезут туда напрямую
• Вспомогательный статический
класс зависит от HttpRuntime
27. Ближайшие цели
• Не лазать в базу через контекст запроса
• Только по прямой ссылке
• Не лазать из методов доменных объектов
• Подготовиться к другому ORM
28. Решение
• Домен – в отдельный пакет
• Убрать логику из доменных объектов *
• Сделать обертку для сессии
• Передавать обертку в сервисы явно
* Уточнение будет позже
29. «Анемичная» доменная модель
• Модель без поведений
• Фаулер не одобряе:
• Нужен ОРМ
• Нет инкапсуляции и полиморфизма
• Скатываемся в процедурный стиль
Надо проектировать классы так, чтобы их всегда можно было полностью покрыть модульными тестами, подменяя окружение mock'ами.Без баз данныхБез Http-запросовБез тестовых файловПосле или во время этого можно уже делать классы"красивыми", соответствующими принципам и догмам. Надо разбивать проект на мелкие кусочки Рассчитывая на то, что кусочки могут заменяться или использоваться в других проектах.Результаты:Код будет покрыт работающими тестами. Ибо тесты не будут зависеть от базы данных, файловой системы и т.п.Код можнорефакторить до красивого вида. Благо тесты естьМелкие проекты не позволят делать перекрестных ссылокОни заставят вас применять IoC,DI и т.д. чтобы заставить все это работать вместе.
Для нас сейчас стараться писать тестопригодный код – несколько поздно. Код уже написан. Писать тесты к существующему коду – неблагодарная задачаНаша первая глобальная задача – разбить проект на куски ... и уменьшить связность кодаЕе выполнениесостоит из решения отдельных конкретных архитектурных проблем.Далее рассмотрим некоторые имеющиеся проблемы и обсудим возможные пути решения.
Читать данные мы можем по-разному: Через доменную модель Прямой запрос из базы Обращение к хранимой процедуреЗапрос из вообще сторонней базы, типа OLAP.И это все хорошо, если удобно.А записывать удобно через доменную модель и ORM. Понятно – т.к. модель отражает структуру базы.Все бы хорошо, если не одно «но»…
Стратегия разделения проекта на много мелких пакетов – это большой вопрос. Нужно выработать четкие и ясные принципы, понятные всем: Что выделять в отдельный проект? Как его именовать? Как подключать к общему решению?Мнения есть, алгоритма – нет. Пока.
Я не люблю понятие «антипаттерн». Паттерн – позитивная, созидательная сущность. Подход к решению вашей проблемы. Проблема конкретна, подход тоже. Все возможные сложности описаны. Это только предложение, одно из многих.Антипаттерн Это полный запрет, абсолютное отрицание.Ты передаешь доменные объекты во вью? Никогда так не делай! Нельзя! Это антипаттерн.Антипаттерн не подразумевает размышлений. Нельзя и все. Даже не пробуй так делать. Почему? Ну это же известный антипаттерн! (Я крут, а ты лох) Даже если антипаттерн в своем оригинальном описании содержит весьма конкретные условия применения («применение антипаттерна» – звучит), «крутые чуваки» опускают для себя всю сложную часть, оставляя простую:Нельзя, потому что запретил Великий Антипаттерн!Антипаттерн сильно отличается от менее категоричных: Я попробовал сделать так, но у меня не получилось. Ну дак, может, у тебя руки кривые?Этот подход может привести к таким-то проблемам. А может не приведет? Условия-то другие. 5 лет прошло, как никак…Антипаттерну нельзя задать эти вопросы. Ибо он есть Истина В Последней Инстанции. Сравните левую и правую части: Левая открывает новую возможность. Правая закрывает разом все.Пока все, но об этом можно долго.