Как я могу приблизиться к проверке на стороне клиента с MVC и WCF без дублирования логики? - PullRequest
3 голосов
/ 04 июня 2011

Возможно, я ищу здесь несуществующий Святой Грааль, но оно того стоит. Для начала, вот краткий обзор нашей архитектуры:

  • Доступ к данным : классы репозитория, которые взаимодействуют с SQL Server через Entity Framework
  • Business Logic : классы Manager вызывают уровень данных и отображают данные в доменные модели
  • Модели доменов : POCO, которые представляют наш домен
  • Сервисная библиотека / Фасад обслуживания : описание операций CRUD для POCO
  • Презентация : ASP.NET MVC (v2, но при необходимости может быть перемещен в v3 - мы все еще находимся в начале нашего проекта)

Проблема, которую мы ищем, состоит в том, как автоматически создать проверку на стороне клиента для обработки основных проблем, таких как обязательные поля, минимальная и максимальная длина, числовые диапазоны и т. Д., - просто ваша основная линия защиты прочее.

Если бы мы использовали DataAnnotations в POCO модели домена (это звучит привлекательно на первый взгляд), мы могли бы позволить ненавязчивой проверке jQuery сделать работу за нас. Чтобы это работало, нам нужно было бы сослаться на библиотеку доменной модели на уровнях Service и Presentation, потому что DataAnnotations не передаются через WCF. К сожалению, нам нужно повторно использовать службу WCF в нескольких приложениях, и если мы пойдем по этому пути, мы, скорее всего, создадим проблемы с блокировкой версий.

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

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

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

Учитывая вышеописанный сценарий, как бы вы справились с проверкой на стороне клиента и все же избежали бы дублирования логики?

EDIT:

Спасибо за ваши мысли. Есть еще один аспект, который я понял, что я забыл включить при обсуждении DataAnnotations: мы рассмотрели использование отражения для получения аннотаций и их возврата через вызов метода для отдельной службы, но это не сработает, потому что они не работают. помечены как Сериализуемые и поэтому не могут быть возвращены через WCF.

Ответы [ 3 ]

2 голосов
/ 04 июня 2011

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

  1. Создать дополнительные функции в вашей службе WCF, которые дают вашим клиентам возможность запрашивать правила проверки в каком-либо формате.и затем внедрите их, используя некоторый пользовательский код.

  2. Вашему клиенту потребуется реализовать собственную логику проверки.

Это было бы убийственной функциейесли WCF может передать правила валидации клиенту, как вы хотите, но это просто невозможно.(

1 голос
/ 04 июня 2011

Вам может помочь ответ на другой вопрос, который я предоставил на днях:

Как лучше проверить бизнес-правила в приложении ASP.NET MVC с трехуровневой архитектурой?

0 голосов
/ 04 июня 2011

Может быть, стоит проверить этот вопрос SO:

Проверить данные с помощью аннотаций данных с WPF и Entity Framework?

...