Архитектура предприятия для ViewModel / Business Logic - PullRequest
1 голос
/ 13 декабря 2011

Это вопрос организации проекта высокого уровня.

Каков «правильный» способ организации проекта / решения (Visual Studio), которое будет содержать много подпрограмм?

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

Изучение корпоративной архитектуры за 24 часа было бы идеально, но, похоже, не существует.

Наша первая попытка была основана на трехуровневой сервисной архитектуре, но в дополнение к общим бизнес-функциям (ProcessOrder (..), BalanceAccount (..) и т. Д.) Нам также нужны данные, специфичные для приложения.

Следуя n-уровневой архитектуре, все приложения все равно должны были бы пройти через BLL -> DLL, чтобы получить какую-либо информацию (ViewModel, данные, специфичные для приложения).

Некоторые классы моделей (BOM) достаточно универсальны, чтобы их можно было использовать повсеместно (Заказ, Счет, Счет, Клиент и т. Д.)

Один из вариантов - объединить все бизнес-объекты в одном проекте Enterprise.BOM и иметь несколько пространств имен - некоторые глобальные в корне, некоторые приложения, специфичные для классов ViewModel.

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

Но с ростом числа приложений будет сложнее повторно использовать существующие объекты / процессы (т.е. каждому приложению может потребоваться что-то делать с информацией о Билле, но он не должен определять свой собственный класс Билла и вместо этого использовать существующие классы из BLL / DAL).

Еще одно направление, которое требуется сверху, заключается в разработке всего с точки зрения SOA: «приложение» фактически превращается в представления / рабочие процессы с всеми бизнес-логиками процесса, определенными в BLL, так что «приложениями» (в основном) Пользовательский интерфейс) может быть заменен уровнем обслуживания для предоставления функциональности внешним системам.

Если уместно, у нас есть магазин .NET с Rules Engine для некоторых вещей, но без Workflow (хотя это возможно через год или два, поэтому будущая интеграция с WS важна).

Заранее спасибо!

1 Ответ

5 голосов
/ 13 декабря 2011

Изучить корпоративную архитектуру за 24 часа было бы идеально

Я бы не стал верить этому, даже если бы он существовал :) Имейте в виду, что не существует единственного верного способа создания архитектуры.предприятие.Нет единого шаблона, который лучше всех остальных в каждой ситуации.Ваше предприятие найдет свой путь.Будут компромиссы, будут компромиссы и т. Д. Некоторые вещи будут иметь смысл для разработчиков, некоторые вещи будут иметь смысл для пользователей, некоторые вещи будут иметь смысл для управления ... Но все должно иметь смысл для бизнеса.

При этом, примите любой совет здесь с недоверием.

Хорошее эмпирическое правило при организации вашего кода - спросите себя "чей кодэтот?"То есть для всего, что вы пишете, какая часть общей системы заботится об этом?Вот где этот код принадлежит.Если это код, который определяет поведение пользовательского интерфейса, он не входит в DAL.Если это код, который поддерживает основную бизнес-логику, он не принадлежит пользовательскому интерфейсу.И так далее.

Один подход, который имеет тенденцию работать для меня, - это Domain Driven Design .Как процесс, я склонен подходить к этому так:

  1. Определить бизнес-модели.Именно здесь все должно быть максимально разумным для большинства людей.Это ваш "вездесущий язык".Все в компании знают, что такое Order.Они все знают, что должно произойти, когда вы звоните Order.Submit() на одного.Это ваш BLL, и все, что его волнует, это бизнес-логика.Не должно быть никаких проблем с пользовательским интерфейсом, никаких проблем с сохранением данных, ничего подобного.Это базовая сборка, которая определяет бизнес-логику и повторно используется в любом приложении в домене.
  2. Определите сохранность данных.Здесь ваши бизнес-модели встречаются с базой данных.Это может быть одна база данных, несколько баз данных, набор баз данных / файловых систем / служб / и т. Д. И т. Д.(Теперь истинное постоянное невежество является чем-то вроде святого Грааля доменного проектирования. Возможно, вашим моделям придется пойти на некоторые компромиссы для вашей инфраструктуры. Это происходит.)
  3. Определите ваши приложения.Это могут быть пользовательские интерфейсы, веб-сервисы и т. Д. С точки зрения ядра домена это не имеет значения.Бизнес-логика - это бизнес-логика, она поддерживается во всем домене, независимо от того, что ее использует.Если конкретное приложение должно переопределить бизнес-логику определенным образом, сделайте это в приложении.Представление данных пользователям, сбор данных от пользователей - вот что заботит приложения.

Теперь некоторые приложения захотят использовать больше настраиваемых объектов.Может быть, одно приложение хочет использовать класс Order, но каким-то образом изменить его.Возможно, даже объединить это с другими классами.Это отлично.Это проблема этого приложения.Внутренне у него будет свой собственный мини-домен, в котором он определяет свои пользовательские модели и имеет свой собственный DAL для преобразования этих моделей в / из моделей базового домена.Это было бы больше «ViewModel» в том смысле, что оно принадлежит непосредственно этому приложению, а не бизнес-логике.

Думайте о каждом приложении как о миниатюрном домене.С точки зрения всего домена каждое приложение является частью пользовательского интерфейса.С точки зрения самого приложения, общий домен - это инфраструктура, стоящая за постоянством приложения.

В общем, вы можете увидеть, что мои проекты Visual Studio организованы так:

Project: MyBusiness.Domain
  Folder: Models
  Folder: Services
  Folder: Repositories
Project: MyBusiness.Infrastructure.DAL
  Reference: MyBusiness.Domain
  Folder: Repositories
Project: MyBusiness.Infrastructure.AddressService
  Reference: MyBusiness.Domain
  Folder: Services
Project: MyBusiness.Application.Intranet
  Reference: MyBusiness.Domain
  Folder: Controllers
  Folder: Views
  Folder: ViewModels
Project: MyBusiness.Application.CustomerIntegrationService
  Reference: MyBusiness.Domain
  Folder: ServiceDTOs

И такна.Я использую контейнер IoC ( StructureMap - мой личный фаворит, но есть много других), чтобы связать зависимости.За исключением Моделей, почти все в проекте Domain является просто интерфейсом.Может быть несколько проектов инфраструктуры, реализующих эти интерфейсы, и каждый проект приложения может настроить, какие из них он хочет использовать при подключении контейнера IoC.

Этот подход довольно четко разделяет проблемы.У вас может быть столько приложений, использующих ядро ​​домена, сколько вы хотите, и вы можете иметь столько реализаций зависимостей (включая реализации тестовых макетов), сколько захотите.

Я надеюсь, что это помогло, а не просто закончилосьпо некоторой касательной.Признаюсь, немного сложно представить, что именно вы задаете в этом вопросе.

...