데이터베이스 집약적 인 인 특정 페이지가있는 ASP.NET MVC 3 (면도기) 웹 응용 프로그램이 있으며 사용자 경험이 최우선 순위입니다.MVC 패턴을 위반하지 않고 캐싱 모델을 구현하는 방법은 무엇입니까?
따라서이 특정 페이지에 캐싱을 도입하려고합니다.
은 현재 캐싱없이처럼 나는, 내 컨트롤러 얇은을 유지하는 동안이 캐싱 패턴을 구현하는 방법을 알아 내려고 노력 해요 : 당신이 볼 수 있듯이
public PartialViewResult GetLocationStuff(SearchPreferences searchPreferences)
{
var results = _locationService.FindStuffByCriteria(searchPreferences);
return PartialView("SearchResults", results);
}
는 컨트롤러가 매우 얇은 , 있어야합니다. 그것은 정보를 얻는 방법/위치에 상관하지 않습니다. 이것이 서비스의 일입니다.
제어 흐름에 대한 참고 사항 몇 :
- 컨트롤러는 그것의 지역에 따라 특정 서비스을 DI'ed 얻을. 이 예에서,이 컨트롤러의 GET는
IQueryable<T>
저장소을 통해 LocationService - 서비스 전화 그리고
T
또는ICollection<T>
에 결과를 실현.
어떻게 캐싱을 구현하려는 :
- 내가 출력 캐싱을 사용할 수 없습니다 - 몇 가지 이유. 우선,이 액션 메소드는 클라이언트 측 (jQuery/AJAX)에서
[HttpPost]
을 통해 호출되며 HTTP 표준에 따라 요청으로 캐시해서는 안됩니다. 둘째, 나는 순수하게 HTTP 요청 인수를 기반으로 캐시하고 싶지 않습니다. 캐시 논리는 훨씬 복잡합니다. 실제로 실제로는 2 단계 캐싱이 진행됩니다. - 위에서 언급했듯이 일반 데이터 캐싱 (예 :
Cache["somekey"] = someObj;
)을 사용해야합니다. - 모두 서비스를 통해 호출이 먼저 캐시를 통과하는 일반적인 캐싱 메커니즘을 구현하고 싶지 않습니다. 이 특정 작업 메서드에서만 캐싱을 원합니다.
먼저 생각의은 (LocationService을 상속하는) 다른 서비스를 만들 말해, 거기 캐싱 워크 플로우를 제공한다 (첫번째 캐시를 확인, DB가 호출 할 경우, 캐시, 반환 결과에 추가 할) 것입니다. 이 문제가
는 : - 여분의 아무것도에 대한 참조
- 서비스는 기본 클래스 라이브러리 있습니다. 여기에
System.Web
에 대한 참조를 추가해야합니다. - 웹 응용 프로그램 외부의 HTTP 컨텍스트에 액세스해야합니다. 이것은 테스트 가능성뿐만 아니라 일반적으로 나쁜 습관으로 간주됩니다.
는 또한 바로 소리를하지 않는 모델 폴더에 캐시 서비스를 (내가 현재 ViewModels 만 사용) 웹 응용 프로그램에 Models
폴더를 사용하지만, 문제에 대해 생각했다.
그래서 - 아이디어가 있습니까? 여기에 사용할 수있는 MVC 관련 항목 (예 : Action Filter 's)이 있습니까?
일반적인 조언/도움말을 크게 높이세요.
''이 특정 액션 메소드에서만 캐싱을 원합니다. '- 당신이 ActionFilter 솔루션을 요구하는 것처럼 들립니다. – Omar