Какую практику лучше использовать для хранилища, когда вам нужно сделать дорогой поиск - PullRequest
0 голосов
/ 27 октября 2009

Хорошо, допустим, у меня есть класс DataRepository с методами, getNames () и getStates (). допустим, эти данные хранятся в веб-сервисе или базе данных, что является дорогостоящей операцией.

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

проблема в том, что при первом вызове вы хотите, чтобы поведение было асинхронным, чтобы избежать блокировки этого дорогостоящего вызова. Каков наилучший способ закодировать это? Тот факт, что этот класс DataRepository выполняет как фактическое межграничное извлечение, так и кэширование, нарушая принцип единой ответственности.

есть еще какие-нибудь мысли о лучших практиках здесь?

Ответы [ 3 ]

1 голос
/ 27 октября 2009

за первый звонок, который вы хотели бы поведение должно быть асинхронным, чтобы избежать блокировки на этот дорогой звонок. Что лучший способ кодировать это?

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

Является ли тот факт, что этот DataRepository класс делает как фактический крест получение и кэширование границ нарушение единой ответственности Принцип.

Да, это нарушает SRP , если сам класс репозитория участвует в реализации извлечения и кэширования. Более того, решение о том, какой источник попадать, обычно требует значительной логики, что является еще одной веской причиной для разделения этих функций на разные классы. (Со стандартным предупреждением: если YAGNI , то не делайте этого!)

1 голос
/ 27 октября 2009

Действительно ли ответственность хранилища - знать, называется ли он асинхронным или нет? Я бы подумал, что он просто сделает свой вызов и вернет свои данные, то, как его вызывают, не его забота. Я также не думаю, что ответственность за хранение данных лежит на ней .... если вы хотите, чтобы данные были сохранены, вызывающая сторона (возможно, посредник) может их сохранить. Хранилище должно быть довольно простым .... запрашивать данные и возвращать данные. Или даже вернуть IQueryable и позволить части, которая нуждается в данных, действительно получить данные ...

0 голосов
/ 27 октября 2009

Если вам нужно сделать первый вызов асинхронным, вы также можете сделать все вызовы асинхронными. Это облегчит написание и понимание вашего кода. Вам не придется иметь дело с 2 различными шаблонами вызовов.

Хранилище данных должно отвечать за одно: получение данных для пользователя. Он извлекает данные из хранилища данных. Это хранилище данных может быть дорогим вызовом WS или DB или дешевым вызовом из кэша. Хранилище данных может проверить наличие данных в кэше и вернуть их или получить данные из WS или DB, поместить их в кэш и затем вернуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...