Надеюсь, вы увидите проблему, которую я описываю в сценарии ниже. Если не понятно, пожалуйста, дайте мне знать.
У вас есть приложение, которое разбито на три слоя,
- уровень пользовательского интерфейса, может быть веб-формой asp.net или окном (используется для редактирования персональных данных)
- уровень бизнес-сервисов среднего уровня, скомпилированный в dll (PersonServices)
- слой доступа к данным, скомпилированный в dll (PersonRepository)
В моем интерфейсе я хочу создать новый объект Person, установить некоторые свойства, такие как FirstName, LastName, в соответствии с тем, что было введено в пользовательском интерфейсе пользователя, и вызвать PersonServices.AddPerson, передавая только что созданный Person , (AddPerson не должен быть статичным, это просто для простоты, в любом случае AddPerson в конечном счете вызовет AddPerson Репозитория, который затем сохранит данные.)
Теперь часть, о которой я хотел бы услышать ваше мнение, это проверка. Где-то вдоль линии, что вновь созданный Человек должен быть проверен. Вы можете сделать это на стороне клиента, что было бы просто, но что, если бы я хотел проверить Person в моем методе PersonServices.AddPerson. Это гарантирует, что любой человек, которого я хочу сохранить, будет проверен и удалит любую зависимость от уровня пользовательского интерфейса, выполняющего работу. Или, может быть, проверить как в пользовательском интерфейсе, так и на уровне бизнес-сервера. Звучит хорошо, пока верно?
Итак, для простоты я обновлю метод PersonService.AddPerson для выполнения следующих проверок проверки
- Проверьте, если FirstName и LastName не пусты
- Убедитесь, что этот новый человек еще не существует в моем хранилище
И этот метод вернет True, если все проверки пройдены и Персона сохранена, False, если Проверка не пройдена или Персона не сохранена.
Но этого логического значения, которое возвращает AddPerson, недостаточно для меня на уровне пользовательского интерфейса, чтобы дать пользователю четкую причину сбоя процесса сохранения. Так что же делать одинокому разработчику? В конечном счете, я хотел бы, чтобы метод AddPerson мог гарантировать, что то, что он собирается сохранить, является действительным, и если нет, иметь возможность сообщать причины, по которым он не является недействительным, для моего уровня пользовательского интерфейса.
Просто, чтобы ваши соки текли, некоторые способы решения этой проблемы могут быть: (Некоторые из этих решений, на мой взгляд, отстойные, но я просто помещаю их туда, чтобы вы поняли, что я пытаюсь решать)
Вместо AddPerson, возвращающего логическое значение, он может возвращать int (т. Е. 0 = Успех, ненулевое значение равно ошибке, а число указывает причину, по которой произошел сбой.
В AddPerson генерировать пользовательские исключения при сбое проверки. Каждый тип пользовательского исключения будет иметь свое собственное сообщение об ошибке. Кроме того, каждое пользовательское исключение будет достаточно уникальным, чтобы его можно было отследить на уровне пользовательского интерфейса
Пусть AddPerson вернет какой-то пользовательский класс, свойства которого будут указывать, пройдена ли проверка или нет, и по каким причинам это произошло
Не уверен, что это можно сделать в VB или C #, но прикрепите какое-либо свойство к Person и его базовым свойствам. Это «прикрепленное» свойство может содержать такие вещи, как информация для проверки
Вставьте сюда свою идею или шаблон
И, может быть, еще здесь
Извините за длинный вопрос, но я определенно хотел бы услышать ваше мнение по этому поводу.
Спасибо!