В настоящее время я пишу приложение ASP.Net из пользовательского интерфейса. Я внедряю MVP-архитектуру, потому что мне надоело Winforms, и я хотел бы, чтобы у нас было более четкое разделение проблем.
Таким образом, с MVP ведущий обрабатывает события, поднятые в представлении. Вот код, который у меня есть, чтобы иметь дело с созданием пользователей:
public class CreateMemberPresenter
{
private ICreateMemberView view;
private IMemberTasks tasks;
public CreateMemberPresenter(ICreateMemberView view)
: this(view, new StubMemberTasks())
{
}
public CreateMemberPresenter(ICreateMemberView view, IMemberTasks tasks)
{
this.view = view;
this.tasks = tasks;
HookupEventHandlersTo(view);
}
private void HookupEventHandlersTo(ICreateMemberView view)
{
view.CreateMember += delegate { CreateMember(); };
}
private void CreateMember()
{
if (!view.IsValid)
return;
try
{
int newUserId;
tasks.CreateMember(view.NewMember, out newUserId);
view.NewUserCode = newUserId;
view.Notify(new NotificationDTO() { Type = NotificationType.Success });
}
catch(Exception e)
{
this.LogA().Message(string.Format("Error Creating User: {0}", e.Message));
view.Notify(new NotificationDTO() { Type = NotificationType.Failure, Message = "There was an error creating a new member" });
}
}
}
У меня есть моя основная проверка формы, сделанная с использованием встроенных элементов управления .Net Validation, но теперь мне нужно проверить, что данные достаточно удовлетворяют критериям уровня обслуживания.
Скажем, следующие сообщения Service Layer могут отображаться:
- Учетная запись электронной почты уже существует (сбой)
- Ссылающийся пользователь не существует (сбой)
- Длина пароля превышает допустимую длину хранилища данных (отказ)
- Пользователь успешно создан (успешно)
Предположим также, что на уровне сервиса, который пользовательский интерфейс не может предвидеть, будет больше правил.
В настоящее время у меня есть сервисный уровень, создающий исключение, если все не так, как планировалось. Это достаточная стратегия? Этот код пахнет вам, ребята? Если бы я написал такой сервисный слой, вы бы раздражали необходимость писать докладчики, которые используют его таким образом? Коды возврата выглядят слишком старой школой, а bool просто недостаточно информативен.
Редактировать не OP: слияние в последующих комментариях, которые были отправлены в качестве ответов OP
Cheekysoft, мне нравится концепция исключения ServiceLayerException. У меня уже есть глобальный модуль исключения для исключений, которые я не ожидаю. Вы считаете, что все эти пользовательские исключения утомительны? Я думал, что уловка базы Исключительный класс был немного вонючим, но не был точно уверен, как прогресс оттуда.
tgmdbm, мне нравится умное использование выражения лямбда там!
Спасибо Cheekysoft за продолжение. Поэтому я предполагаю, что это будет стратегия, если вы не возражаете против того, чтобы пользователь отображал отдельную страницу (я в первую очередь веб-разработчик), если исключение не обрабатывается.
Однако, если я хочу вернуть сообщение об ошибке в том же представлении, где пользователь отправил данные, вызвавшие ошибку, мне пришлось бы поймать исключение в презентаторе?
Вот что выглядит CreateUserView, когда Presenter обработал исключение ServiceLayerException:
Для такого рода ошибок приятно сообщить об этом в один и тот же вид.
В любом случае, я думаю, что мы выходим за рамки моего первоначального вопроса. Я буду играть с тем, что вы опубликовали, и если мне нужны подробности, я отправлю новый вопрос.