Вы можете проверить некоторые простые вещи (например, соответствует ли поле определенному регулярному выражению или достаточно длинный пароль), добавив атрибуты к вашим свойствам в сгенерированном классе .metadata, который обычно генерируются доменными службами, если вы позволяете им.
Что касается вещей, связанных с бизнес-логикой (например, если пароль уже существует и т. Д.), Я бы лично выбрал вариант 1.
Нет ничего плохого в этом подходе на самом деле ... кажется, гораздо более приемлемым, чем ваш третий вариант, в долгосрочной перспективе. Вам нужно всего лишь изменить, какие методы на стороне сервера вы вызываете в своей модели представления вместо изменения кода на стороне сервера. Может быть, в какой-то момент у вас будут разные правила проверки для определенных типов пользователей? Тебе нужно подумать об этом.
Гипотетически, вы можете использовать отражение на сервере и передавать имена методов проверки от клиента, и позволить серверу выяснить, что нужно сделать, основываясь на именах методов. Похоже, достойный вариант, но, вероятно, более запутанным, чем другие.
EDIT:
Если вы хотите превратить асинхронные вызовы в синхронизированные, лучше использовать что-то вроде:
Context.Load(Context.GetUsersQuery()).Completed += (sender, args) =>
{
//Context.Load... next call
};
вместо ожидания произвольного количества времени.