Как разделить слой данных и слой бизнес-объектов, каковы соответствующие обязанности каждого из них? - PullRequest
3 голосов
/ 31 июля 2009

Если бы существовал ряд бизнес-приложений, подобный этому, было бы это подходящим разделением труда:

Доступ к данным

  • Вызывает только хранимые процедуры, сопоставляет свойства DTO s с хеш-таблицей, которые используются для заполнения коллекций параметров команды ADO.NET.

  • Только сборка со ссылкой на SqlDataClient.

  • Значительная логика, связанная с тем, что означает пустое, нулевое и пустое в коде отображения, но в остальном не требует проверки или другой предметной логики.

так называемая бизнес-логика

  • разбивает несколько результирующих наборов на отдельные таблицы данных, например,

    public void ReturnNthRecordSetFromStoredProcFoo ()

  • перейти к доступу к данным для наборов данных, например,

    public void ReturnDataSet (имя строки) { return (новый PersonController) .GetAnotherDataSet (name);}

  • отображает одну строку таблицы данных в одну DTO s

  • Значительная логика, связанная с тем, что означает пустой, нулевой и пустой в коде отображения.
  • Содержит объект транзакции, хотя он используется исключительно для переноса отдельных вызовов хранимых процедур.
  • Не имеет ссылки на SqlDataClient, поэтому он не может использовать SqlDataReaders для заполнения DTO
  • Нет ссылки на System.Web.UI
  • Правила авторизации, но не логика, специфичная для домена.

UI

  • Двухстороннее связывание данных DTO с формами ASP.NET.
  • Проверка свойств элементов управления - обычно нет проверки непосредственно в отношении DTO
  • «Коллекции» перемещаются путем привязки DataSets к сеткам. Фактически, попытка что-либо сделать с коллекциями требует, чтобы пользовательский интерфейс перебирал DataRows в DataTables и знал, каковы соответствующие имена столбцов (которые обычно только похожи на DTO)

Итак, наконец, вопрос - с этим приложением, должен ли уровень доступа к данным взять на себя обязанности так называемого бизнес-уровня? Разве это уже не двухуровневый (почти одно!) применение кроме неудобства дополнительной сборки?

Дополнительная информация: Хорошо, я уже знаю, что сервер приложений будет одной машиной, вероятно, навсегда, так как это приложение для внутренней сети с небольшим количеством пользователей. Так что я знаю, что не нужно разрабатывать физически отдельные уровни приложений. Кроме того, он, вероятно, будет поддерживать только один пользовательский интерфейс и будет полностью удален, если ему когда-либо потребуется поддержка чего-то другого, кроме ASP.NET - другой часто цитируемой причины для уровней / слоев.

Ответы [ 3 ]

3 голосов
/ 31 июля 2009

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

В нашей организации мы используем CSLA framework . Это инфраструктура бизнес-объектов, которая стремится сделать многофункциональные пользовательские интерфейсы с привязкой к данным простыми в использовании и обслуживании, обеспечивая при этом гибкость на уровне данных.

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

Его " dataportal " (статья более старая, но все еще актуальна) позволяет легко перемещать доступ к данным на свой собственный уровень без особых усилий и без изменения кода.

DNRtv имеет несколько видеороликов, в которых дизайнер CSLA Рокфорд Лотка показывает работу примера приложения. Часть 1 и Часть 2 .

Шоу продолжительностью всего один час, и, вероятно, они помогут вам решить, подходит ли вам это использование.

3 голосов
/ 31 июля 2009

Мне кажется, что ответственность между уровнями немного запутана. Слой данных звучит довольно стандартно. (Так называемый) бизнес-уровень - это место, где все запутано.

Некоторые мысли о бизнес-уровне:

  • Кажется, есть много представлений данных. Вы упоминаете DataTables, DataSets, объекты передачи данных. Стандартный подход ко всему приложению был бы лучше.

  • Методы бизнес-уровня с именами, такими как ReturnNthRecordSetFromStoredProcFoo и ReturnDataSet, не имеют смысла и не обеспечивают соответствующий уровень абстракции для бизнес-сервисов. (Может быть, это были просто плохо выбранные примеры не из приложения?)

  • Как правило, бизнес-уровень обеспечивает больше, чем проходит набор данных. Вместо того чтобы иметь дело с отображениями, нулями и т. Д., Бизнес-уровень должен сосредоточиться на проверке, бизнес-правилах, безопасности и, возможно, даже аудите (хотя некоторые предпочитают делать это в базе данных).

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

  • Я думаю, что с зависимостями все в порядке - нет ссылки на Web.UI или SQLClient из бизнес-уровня.

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


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

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

Некоторые другие вопросы для размышления: какие основные проблемы вы хотите решить? Являются ли они функциональными (например, ошибки, отсутствие стабильности)? Или производительность связана? Или это архитектурно? Или, возможно, связано с ремонтопригодностью - вам нужно добавить новую функциональность, но вам сложно? У вас есть временные рамки или бюджет? Если вы сможете ответить на некоторые из этих вопросов, это может помочь вам.

1 голос
/ 31 июля 2009

Я бы ожидал увидеть то, что вы описываете как свой бизнес-уровень, как материал типа слоя данных. Я надеюсь, что мой уровень данных защитит меня от необходимости беспокоиться о нулях и подобных вещах. Я также надеюсь, что мой бизнес-уровень будет содержать более абстрактные бизнес-правила и концепции. Например, если «Группа» - это набор «Пользователей», я бы хотел видеть функции бизнес-типа для управления этими пользователями как частью группы на высоком уровне. Например, может быть, функция, которая назначает разрешения всем членам этой группы или позволяет уровню пользовательского интерфейса применять политики к этим пользователям как членам группы. Я не надеюсь увидеть функции, которые пытаются скрыть тот факт, что все они пришли из базы данных. Я надеюсь, что это полезно.

...