비용이 많이 드는 검색을 수행해야 할 때 저장소에 사용하는 가장 좋은 방법은 무엇입니까?

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

문제

좋아, 내가 가지고 있다고 가정해보자 데이터 저장소 메소드가 있는 클래스, getNames() 그리고 getStates().이 데이터가 비용이 많이 드는 작업인 웹 서비스나 데이터베이스에 저장되어 있다고 가정해 보겠습니다.

첫 번째 쿼리가 실행되고 반환되면 소비자가 이러한 메서드를 요청하면 결과가 DataRepository 클래스에 캐시되므로 즉시 반환됩니다.

문제는 첫 번째 호출의 경우 비용이 많이 드는 호출이 차단되는 것을 방지하기 위해 비동기식으로 동작해야 한다는 것입니다.이것을 코딩하는 가장 좋은 방법은 무엇입니까?이 DataRepository 클래스가 단일 책임 원칙을 깨뜨리는 실제 경계 간 검색과 캐싱을 모두 수행한다는 사실입니다.

여기에 모범 사례에 대한 다른 생각이 있습니까?

도움이 되었습니까?

해결책

첫 번째 통화의 경우이 값 비싼 호출의 차단을 피하기 위해 동기화가되기를 원할 것입니다. 이것을 코딩하는 가장 좋은 방법은 무엇입니까?

그것은 발신자의 관심사입니다. 클라이언트가 자신의 위치에 적합한 것을 결정할 수 있도록 동기 및 비동기 인터페이스를 모두 제공하는 것이 가장 좋습니다.

이 DataRepository 클래스가 실제 크로스 경계 검색 및 캐싱 단일 책임 원리를 모두 수행하고 있다는 사실입니다.

예, 그것은 깨집니다 SRP 저장소 클래스 자체가 검색 및 캐싱 구현에 관여하는 경우. 또한, 어떤 출처에 대한 결정은 일반적으로 중요한 논리가 필요하며, 이는 이러한 기능을 다른 클래스로 분리하는 또 다른 좋은 이유입니다. (표준 경고 : if 야그니, 그럼 그렇게하지 마세요!)

다른 팁

실제로 비동기 호출되는지 아닌지 아는 것이 실제로 저장소의 책임입니까? 나는 그것이 단지 전화를 걸고 데이터를 반환 할 것이라고 생각할 것입니다. 부름을받는 방법은 신경이 아니라고 생각합니다. 또한 데이터를 저장하는 것이 책임이라고 생각하지 않습니다 .... 데이터를 저장하려면 발신자 (일부 중개자 가능)가 저장할 수 있습니다. 저장소는 매우 간단해야합니다 .... 데이터를 요청하고 데이터를 반환합니다. 또는 IQueryable을 반환하고 데이터가 필요한 부분이 실제로 데이터를 얻도록하십시오 ...

첫 번째 호출을 비동기화해야 한다면 모든 호출을 비동기화할 수도 있습니다.이렇게 하면 코드를 더 쉽게 작성하고 이해할 수 있습니다.두 가지 다른 통화 패턴을 처리할 필요가 없습니다.

데이터 저장소는 다음 한 가지를 담당해야 합니다.사용자에게 데이터를 가져옵니다.데이터 저장소에서 데이터를 검색합니다.해당 데이터 저장소는 WS 또는 DB에 대한 값비싼 호출일 수도 있고 캐시에서의 값싼 호출일 수도 있습니다.데이터 저장소는 캐시에 데이터가 있는지 확인하고 이를 반환하거나 WS 또는 DB에서 데이터를 가져와 캐시에 넣은 다음 반환할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top