Получение данных из удаленного сервиса, если не кэшируемый в базе данных - предложение необходимо

Вы подразумеваете, что Ваш JavaScript имеет все данные в памяти и показывает одну страницу во время? Или это, это загружает каждую страницу с сервера, поскольку это необходимо, с помощью Ajax?

, Если это - последний, Вы также, возможно, должны думать о сортировке. При сортировке использования JavaScript Вы только будете в состоянии отсортировать одну страницу за один раз, которая не имеет большого количества смысла. Таким образом, Ваша сортировка должна быть сделана на сервере.

5
задан Max 24 September 2009 в 07:47
поделиться

4 ответа

Вы можете чисто реализовать свою архитектуру с помощью шаблона Decorator .

Представим, что у вас есть интерфейс под названием ICustomerRepository.

Сначала вы реализуете ICustomerRepository (давайте назовите его WsCustomerRepository) на основе веб-службы и не беспокойтесь о базе данных в этой реализации.

Затем вы реализуете другой ICustomerRepository (MySqlRepository), который только общается с вашей базой данных.

] Наконец, вы создаете третий ICustomerRepository (CachingRepository), который реализует описанную вами логику кэширования. Он начинается с запроса «локального» репозитория, но если он не получает результата, он запрашивает «удаленный» репозиторий и вставляет результат в «локальный» репозиторий, прежде чем вернуть результат.

5
ответ дан 14 December 2019 в 19:19
поделиться

На мой взгляд, это идеальный кандидат на уровень сервиса.

У вас есть два источника данных (DB Repo и Web Service), и вам нужно инкапсулировать их для контроллера, как вы предложили.

Если на уровне сервиса есть метод, который может вызывать ваш контроллер, например:

public class Controller
{
    private CustomerService _customerService; // Perhaps injected by an IoC container?

    public ActionResult SomeAction(int id)
    {
        return Json(_customerService.GetCustomerById(id));
    }
}

Тогда сервисный уровень может обрабатывать бизнес-логику / кэширование следующим образом (вы можете внедрить репозиторий):

public class CustomerService 
{
    private readonly ICustomerRepository _customerRepository;

    public CustomerService(ICustomerRepository customerRepository)
    {
        _customerRepository = customerRepository;
    }

    public Customer GetCustomerById(int id)
    {
        var cached = _customerRepository.FindByPK(id);
        if(cached != null) return cached;

        var webserviceData = Webservice.GetData(id);  // You could inject the web service as well...
        var customer = ConvertDataToCustomer(webserviceData);

        _customerRepository.SaveCustomer(customer);

        return customer;
    }
}

Затем вы можете сохранить логику репозитория и веб-службы в отдельных классах или (что еще лучше) в отдельных сборках.

Надеюсь, что это поможет!

0
ответ дан 14 December 2019 в 19:19
поделиться

В целом мне нравится ответ Марка, но я бы добавил два важных примечания.

  1. Следует ли вам вообще кэшировать это в своей БД ? Для меня это идеальное использование кеша приложений. Обычно у меня есть интерфейс кэширования, который инкапсулирует кеш приложения HTTP и имеет простые в использовании методы, которые автоматически проверяют наличие ключа, иначе они вызывают ваш метод и помещают в кеш. Также вы можете установить срок его действия, чтобы он автоматически истек через определенное количество времени.

    var result = CacheManager.Add (() => YourMethodCall (), "CachedStuffKey", new Timespan (0,1,0));

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

  1. Я согласен с тем, что этот тип логики действительно не подходит для контроллера , ваш контроллер должен быть довольно глупым и быть связующим звеном между вашим пользовательским интерфейсом и нижними слоями. Хотя это зависит от того, какое приложение вы создаете. Не все приложения должны быть трехуровневыми суперструктурами.
0
ответ дан 14 December 2019 в 19:19
поделиться

Лично в этом сценарии я бы пересмотрел ваш дизайн. Я бы подумал о наличии отдельного процесса (возможно, службы Windows), который обновляет вашу базу данных MySql из удаленной службы.

Таким образом, клиенты всегда могут получать данные из вашей локальной БД без необходимости блокировать на значительное время . Если необходимо, вы все равно можете использовать кеширование при получении данных из MySql DB.

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

0
ответ дан 14 December 2019 в 19:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: