Приложения WCF/Client - куда должна идти бизнес-логика?
Мы создаем веб-сервис WCF с использованием WSSF. Идея состоит в том, что он предоставит нашу основную базу данных через сервис и позволит нам создавать различные приложения и веб-сайты поверх сервиса. В данный момент я создаю простое клиентское приложение, которое будет загружать некоторые данные из этого сервиса, манипулировать ими, а затем передавать их пользователю в виде файла CSV отчета.
Теперь вопрос в том, где должна располагаться бизнес-логика (которая манипулирует данными)? Я подумал, что я бы положил его в сервис. У меня уже есть бизнес-слой с простыми объектами, которые сопоставляют базу данных (клиент, заказ и т. Д.) Почти один к одному. Я подумал, что сделаю несколько объектов "более высокого уровня" для манипулирования данными. Например, используя клиента, заказ и другие объекты, создавая отчет и т. Д., Я подумал, что лучшее место для этого будет на бизнес-уровне для сервиса. Таким образом, мы могли бы повторно использовать эту логику для различных приложений, если это необходимо.
К сожалению, мой босс не согласен. Он хочет "разделения интересов" и говорит, что правильное место для этой логики будет на бизнес-уровне внутри клиентского приложения, а не в сервисе. Я думаю, это может быть проще, но я хотел бы использовать свою мощную объектную модель внутри бизнес-уровня сервиса для написания этого кода. Объекты, предоставляемые сервисом, не являются "реальными" объектами и на самом деле представляют собой просто легкие структуры данных без возможности полной объектной модели, которая существует внутри бизнес-уровня сервиса.
Что, вы парни, думаете?
3 ответа
Мой голос будет понятен:
- положить как можно больше проверок целостности данных в базу данных
- помещать любые другие проверки бизнес-логики в слой бизнес-логики на стороне сервера службы
- поместите только простые проверки, такие как "обязательное поле" и т. д. на уровень клиента, оптимально автоматически определяемый из модели базы данных или вашей бизнес-модели
Почему база данных?
SQL в любой форме или форме имеет некоторые базовые и очень мощные возможности проверки - убедитесь, что материал уникален, убедитесь, что реляционная целостность таблиц задана и так далее - ИСПОЛЬЗУЙТЕ ЭТО! Если вы выполните эти проверки в базе данных, то независимо от того, каким образом ваш пользователь в конечном итоге подключится к вашим данным (ужасный сценарий: менеджеры смогут напрямую подключаться к вашим таблицам с помощью Excel для выполнения какой-либо работы Business Intelligence......), эти проверки будут на месте и будут применяться. Обеспечение целостности данных является обязательным требованием в любой системе.
Почему бизнес логика на сервере?
По той же причине, о которой говорили другие ответчики: централизация. Вы не хотите иметь бизнес-логику и свои чеки только в клиенте. Что, если какой-то другой отдел в вашей компании или сторонний внешний консультант внезапно начнут использовать ваш сервис, но все проверки и проверки бизнеса не будут проведены, так как они не знают о них?? Не очень хорошая вещь......
Логика в клиенте
Да, конечно - вы также хотите поставить несколько простых проверок в клиенте, особенно если это веб-приложение. Такие вещи, как "это поле обязательно для заполнения" или "максимальная длина для этого поля" и т. Д., Должны применяться как можно раньше. В идеале это будет автоматически выбираться клиентами из уровня базы данных / сервиса. Серверные элементы управления ASP.NET имеют клиентскую проверку, которая может быть автоматически включена. Службы RIA Silverlight могут подобрать ограничения данных в вашей внутренней модели данных и перенести их на уровень клиента.
Для этого не существует жесткого и быстрого правила, но в этом случае я бы сказал, что ваш начальник более неправ, чем вы:) У каждого будет несколько иное мнение по этому поводу, и может быть ряд причин, по которым ваша бизнес-логика размещать в местах, отличных от бизнес-уровня, но редко есть причина помещать его в клиентское приложение - вы можете утверждать, что когда оно находится в клиентском приложении, то это скорее пользовательский интерфейс или правило представления, чем бизнес-правило.
Если веб-сервисы будут использоваться рядом приложений, то вы должны максимально использовать бизнес-логику на стороне веб-сервиса. На самом деле у меня был бы очень тонкий слой веб-сервиса, все, что он делает, это принимает вызов, а затем передает выполнение реальному бизнес-уровню. Я также хотел бы сопоставить данные базы данных и сущности бизнес-данных на уровне базы данных, а не на уровне бизнеса.
Я думаю, что "правильно" зависит от архитектуры вашего приложения. В разделении интересов, безусловно, есть ценность. Похоже, ваш начальник считает, что текущая модель должна использовать сервер в качестве слоя доступа к данным, который отображает базу данных в бизнес-объекты, и что бизнес-логика должна быть реализована на клиенте.
Вы по-прежнему можете разделить вопрос о том, реализована ли бизнес-логика на клиенте или на сервере. Здесь учитывается не то, где вы выполняете обработку, а то, насколько четко вы спроектировали интерфейсы между уровнями приложения.
Это может помочь узнать больше о клиенте. Вы имеете дело с браузером / клиентом Javascript? Если это так, то я бы сохранял как можно больше обработки на сервере и отправлял данные клиенту более или менее в той форме, в которой вы хотите, чтобы они отображались.
Если это клиент C#, то у вас гораздо больше возможностей для работы с этой целью. Вероятно, вы могли бы преобразовать ответы службы WCF в те же классы бизнес-объектов, которые вы использовали на стороне сервера, и получить те же возможности, что и на сервере. (Просто разделите классы бизнес-объектов между двумя решениями.)