qual é a melhor prática para usar para o repositório quando você precisa fazer a recuperação caro

StackOverflow https://stackoverflow.com/questions/1631013

Pergunta

Ok, digamos que eu tenho um DataRepository classe com os métodos, GetNames () e getStates (). vamos dizer que estes dados são armazenados em um webservice ou banco de dados que é uma operação cara.

Uma vez que a primeira consulta é executada, e voltou, quando um consumidor pediu para estes métodos sua devolvidos imediatamente como os resultados são armazenados em cache na classe DataRepository.

a questão é, para a primeira chamada que você gostaria de comportamento para ser assíncrono para evitar o bloqueio sobre este convite caro. Qual é a melhor maneira de codificar isso? É o fato de que esta classe DataRepository está fazendo tanto recuperação real boundry cruz e cache quebrando único princípio Respnosibility.

quaisquer outros pensamentos sobre as melhores práticas aqui?

Foi útil?

Solução

para a primeira chamada que você gostaria de comportamento a ser assíncrono de bloqueio evite sobre este convite caro. O que é melhor maneira de código isso?

Essa é a preocupação de um chamador. É melhor para fornecer ambas as interfaces síncronas e assíncronas para que os clientes podem decidir o que é apropriado para sua situtation.

É o fato de que este DataRepository classe está fazendo tanto cruz real recuperação boundry e cache quebra responsabilidade única Princípio.

Sim ele quebra o SRP se a própria classe de repositório está envolvido em a recuperação e armazenamento em cache implementação. Além do mais, a decisão sobre qual fonte de bater normalmente requer lógica significativa, o que é outra boa razão para separar estas funções em diferentes classes. (Com a ressalva padrão: se YAGNI , então não fazê-lo)

Outras dicas

É realmente a responsabilidade do repositório de saber se ele está sendo chamado assíncrona ou não? Gostaria de pensar que seria apenas fazer a sua chamada e retornar seus dados, como está sendo chamado não é seu cuidado. Eu também não acho que é a sua responsabilidade para armazenar os dados .... se você deseja que os dados armazenados, o chamador (alguns intermediário possivelmente) pode armazená-lo. O repositório deve ser bastante simples .... pedir dados e dados de retorno. Ou até mesmo retornar IQueryable e deixar a peça que precisa dos dados realmente obter os dados ...

Se você tem que fazer o primeiro assíncrona chamada, assim como você pode fazer todas as chamadas assíncronas. Isso fará com que seu código mais fácil de escrever e compreender. Você não terá que lidar com 2 padrões de chamadas diferentes.

O repositório de dados deve ser responsável por uma coisa: Obter os dados para o usuário. Ele recupera os dados a partir de um armazenamento de dados. Esse armazenamento de dados poderia ser a chamada caro para WS ou DB ou a chamada barato de cache. O repositório de dados pode verificar a existência dos dados no cache e retorno que ou obter os dados da WS ou DB, colocá-lo no cache e, em seguida, devolvê-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top