Попытка устранить избыточное выполнение кода для проверки и сущности

Я смотрю, есть ли способ исключить один из двух вызовов моего метода к картам Google для вычисления длинных / широтных координат.

Вот мой метод.

    public static GeocoderCoordinates GetCoordinates(string region)
    {
        WebRequest request = WebRequest.Create("http://maps.googleapis.com/maps/api/geocode/xml?sensor=false&address=" + HttpUtility.UrlEncode(region));

       using (WebResponse response = request.GetResponse())
       {
          using (Stream stream = response.GetResponseStream())
          {
             XDocument document = XDocument.Load(new StreamReader(stream));

             XElement longitudeElement = document.Descendants("lng").FirstOrDefault();
             XElement latitudeElement = document.Descendants("lat").FirstOrDefault();

             if (longitudeElement != null && latitudeElement != null)
             {
                return new GeocoderCoordinates
                {
                   Longitude = Double.Parse(longitudeElement.Value, CultureInfo.InvariantCulture),
                   Latitude = Double.Parse(latitudeElement.Value, CultureInfo.InvariantCulture)
                };
             }
          }
        }
        return null;
    }

В первый раз я вызываю этот метод для проверки.

internal class ValidateLocationAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var location = value as string;

        GeocoderCoordinates coordinates = Geocoding.GetCoordinates(location);
        if (coordinates == null)
            return false;

        return true;
    }
}

и если нет найденного местоположения, он возвращает нуль - проверка не пройдена. Второй раз, когда он вызывается, в контроллере устанавливаются координаты долготы / широты в моей сущности.

[HttpPost]
    public ActionResult Edit(EditStudentViewModel viewModel)
    {   
        if (ModelState.IsValid)
        {
            Student student = studentRepository.Find(User.Identity.GetUserId());

            if (student == null)
            {
                var newStudent = new Student
                {
                    AspNetUserRefId = viewModel.AspNetUserRefId,
                    CatchPhrase = viewModel.CatchPhrase,
                    StartedPracticing = Convert.ToInt16(viewModel.SelectedYearId),
                    LocationPoints = Geocoding.GetDbGeography(viewModel.Location),
                    Location = viewModel.Location,

Так что я бегу через этот метод дважды, чтобы вставить / обновить студента. Кажется, немного излишним.

Нет ли способа вызвать / установить состояние проверки во время выполнения кода в контроллере, поэтому мне не нужно вызывать этот метод дважды (один раз для проверки и один раз для установки фактических значений), когда пользователь отправляет форму?

Я думал о кешировании, но не думаю, что это хорошая идея, если кто-то не может указать на что-то.

1 ответ

Если вы считаете, что применение проверки заранее с использованием атрибута в текстовом поле служит для пользователя полезным (ранняя обратная связь), оставьте все как есть. Два звонка совсем не плохо, учитывая ценность и чистоту решения.

Второй вариант - вы можете удалить атрибут и выполнить проверку в действии контроллера. Если проверка не удалась, отобразите ту же форму со всеми теми же данными, но с сообщением об ошибке для значения текстового поля (местоположение). Пользователь должен будет выбрать другое местоположение и затем отправить.

Это компромисс.

Важный совет: вы можете оптимизировать свое решение, сохраняя названия регионов в вашей БД и переходя на Google API, только если имя региона не присутствует в вашей БД.

Другие вопросы по тегам