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

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

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

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

  • Только сборка применительно к SqlDataClient.

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

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

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

    public void ReturnNthRecordSetFromStoredProcFoo ()

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

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

  • сопоставляет одну строку DataTable с одним DTO s

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

UI

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

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

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


person MatthewMartin    schedule 31.07.2009    source источник
comment
См. Мой ответ по адресу: stackoverflow.com/questions/549305/ Не забудьте проголосовать, если вам нравятся мои идеи.   -  person    schedule 31.07.2009


Ответы (3)


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

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

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

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

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

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

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

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


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

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

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

person Randy supports Monica    schedule 31.07.2009

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

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

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

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

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

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

person Darien Ford    schedule 31.07.2009
comment
Физические уровни также могут определяться потребностями безопасности. например веб-сервер (с бизнес-уровнем) в DMZ может не иметь доступа к базе данных. Кроме того, если ваше приложение спроектировано правильно, вы можете развернуть все приложение на одном физическом сервере (оставив базу данных на данный момент), а если нагрузка слишком высока, вы можете выполнить горизонтальное масштабирование с помощью другого сервера с балансировкой нагрузки (но все же на одном физическом уровне. ). - person Randy supports Monica; 31.07.2009

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

person Jon    schedule 31.07.2009