Я получил обещание начать создание основы для новой архитектуры для нашей базы кода в моей компании. Импульсом для этой инициативы является тот факт, что:
- Наша база кода старше десяти лет и, наконец, разбивается на швы, когда мы пытаемся масштабировать.
- Верхние "слои", если вы хотите назвать их такими, представляют собой беспорядок классического ASP и .NET.
- Наша база данных заполнена кучей нечестивых хранимых процедур, которые содержат тысячи строк бизнес-логики и проверки.
- Ранее разработчики создавали "умные" решения, которые не расширялись, не подвергались повторному использованию и демонстрировали очень очевидные анти-шаблоны; они должны быть устаревшими в короткий срок.
Я ссылаюсь на Руководство по архитектуре и практикам MS довольно сильно, поскольку я работаю над первоначальным дизайном, но у меня все еще есть некоторые затяжные перед тем, как я совершу что-либо. Прежде чем я займусь вопросами, вот что я имею до сих пор для архитектуры:
(на высоком уровне)
(Слои "Бизнес и данные" )
Диаграммы в основном показывают, как я намерен разбить каждый слой на несколько сборок. Таким образом, в этой архитектуре-кандидате у нас будет одиннадцать сборок, не включая самые верхние слои.
Здесь разбивка с описанием каждой сборки:
-
Company.Project.Common.OperationalManagement
: Содержит компоненты, которые реализуют политики обработки исключений, протоколирование, счетчики производительности, конфигурацию и трассировку. -
Company.Project.Common.Security
: содержит компоненты, которые выполняют аутентификацию, авторизацию и проверку. -
Company.Project.Common.Communication
: Содержит компоненты, которые могут использоваться для связи с другими службами и приложениями (в основном, с множеством повторно используемых клиентов WCF). -
Company.Project.Business.Interfaces
: содержит интерфейсы и абстрактные классы, которые используются для взаимодействия с бизнес-уровнем с уровнями высокого уровня. -
Company.Project.Business.Workflows
: Содержит компоненты и логику, связанные с созданием и обслуживанием бизнес-процессов. -
Company.Project.Business.Components
: Содержит компоненты, которые инкапсулируют бизнес-правила и проверку. -
Company.Project.Business.Entities
: содержит объекты данных, которые являются репрезентативными для бизнес-объектов на высоком уровне. Некоторые из них могут быть уникальными, некоторые могут быть композитами, образованными из более гранулированных объектов данных из уровня данных. -
Company.Project.Data.Interfaces
: содержит интерфейсы и абстрактные классы, которые используются для взаимодействия с уровнем доступа к данным в стиле репозитория. -
Company.Project.Data.ServiceGateways
: Содержит клиентские службы и компоненты, которые используются для вызова и извлечения данных из внешних систем. -
Company.Project.Data.Components
: Содержит компоненты, которые используются для связи с базой данных. -
Company.Project.Data.Entities
: Содержит гораздо более гранулированные сущности, которые представляют бизнес-данные на низком уровне, подходящие для сохранения базы данных или другого источника данных транзакционным способом.
Мое намерение состоит в том, что это должен быть строго-слоистый дизайн (слой может взаимодействовать только со слоем непосредственно под ним), а модульное разрушение слоев должно способствовать высокой когезии и ослаблению связи. Но у меня все еще есть некоторые проблемы. Вот мои вопросы, которые, по моему мнению, достаточно объективны, что они подходят здесь на SO...
- Являются ли мои соглашения об именах для каждого модуля и его соответствующей сборки стандартными соглашениями, или есть другой способ, которым я должен заниматься?
- Полезно ли разбить бизнес и слои данных на несколько сборок?
- Полезно ли иметь интерфейсы и абстрактные классы для каждого уровня в своих собственных сборках?
- САМЫЙ ВАЖНО. Полезно ли иметь сборку "Сущности" как для бизнеса, так и для слоев данных? Меня беспокоит, что если вы включите классы, которые будут сгенерированы LINQ to SQL внутри компонентов доступа к данным, то данный объект будет представлен в трех разных местах базы кода. Очевидно, что такие инструменты, как AutoMapper, могут помочь, но я все еще не 100%. Причина, по которой я их разломала, как это, - A - Обеспечить строго-слоистую архитектуру и B - Содействовать ослаблению связи между слоями и минимизировать поломку, когда происходят изменения в бизнес-области за каждым объектом. Тем не менее, я хотел бы получить некоторые рекомендации от людей, которые гораздо более приукрашены в архитектуре, чем я.
Если бы вы могли ответить на мои вопросы или указать мне в правильном направлении, я был бы очень благодарен. Спасибо.
EDIT: Хотелось включить некоторые дополнительные детали, которые, кажется, более уместны после прочтения ответа Бабуна. Таблицы базы данных также являются нечестивым беспорядком и в лучшем случае являются квазиреляционными. Тем не менее, мне не разрешено полностью переквалифицировать базу данных и выполнять очистку данных: самая дальняя до ядра, которую я могу сделать, - это создать новые хранимые процедуры и начать осуждать старые. Поэтому я склоняюсь к тому, чтобы сущности, явно определенные в слое данных, пытались использовать классы, созданные LINQ to SQL (или любые другие ORM), поскольку объекты данных просто не кажутся выполнимыми.