2012-02-22 2 views
3

MVC + EF를 통해 슬그개를 고르고 올바른 방식으로 작업하는 데 집중하려고합니다. 지금은 양식에 드롭 다운을 추가하려고하지만 페이지가로드 될 때마다 데이터베이스를 치지 않으므로 앱 수준에서 데이터를 저장하고 싶습니다. 나는 응용 프로그램 수준 변수를 만드는 것이 최선의 방법이 아니라고 생각합니다. 놀랍게도 캐시와 정적 유틸리티 기능을 사용하는 방법에 대해 읽은 적이 있지만 그다지 결정적인 것은 없습니다. (단위 테스트에 대한 나쁜 정적 클래스, MVC의 앱 수준에서 데이터베이스에 저장된 조회 데이터를 유지하는 모범 사례

나쁜 캐싱 그래서 난에 대해 궁금 두 가지 시나리오를 가지고있는 방법은 두 가지.

일 사이에 다를 것입니다 있는지 확실하지 않습니다) 기본 조회 50 개 주를 예로 들어 봅시다. 정의 된 작은 것은 결코 바뀌지 않을 것입니다. 응용 프로그램 시작시로드하십시오. (하드 코딩 된 솔루션을 찾고 있지는 않지만 데이터베이스에서 검색합니다.)

2) 조회가 거의 변경되지 않으며 관리자와 같은 화면을 통해서만 가능합니다. 예를 들어, 제품이 판매되는 도시/상점을 가정 해 봅시다. 따라서 데이터는 모델에 으로 저장되지만 다른 누군가가 애플리케이션을 통해 변경하지 않는 한 상대적으로 정적입니다. 그래서 드롭 다운 /리스트 박스를 채울 필요가있을 때마다 데이터베이스에 접근하지 않을 것입니다.

은 기본적인 것들처럼 보인다하지만 기본적으로 대답하지 않았다가이 주제와 동일합니다 :

Is it good to use a static EF object context in an MVC application for better perf?

어떤 도움에 감사드립니다.

답변

2

몇 가지 질문에 답변 해 드리겠습니다. 첫째, MVC에서 정적 변수 나 캐싱 패턴을 사용하는 것이 본질적으로 나쁩니 까? 대답은 단순히 아니오입니다. 아키텍처가 지원하는 한 괜찮습니다. 캐시를 올바른 위치에 배치하고 나중에 설명 할 테스트 용으로 설계하십시오.

두 번째 부분은 이러한 유형의 지속 된 데이터를 저장하는 "올바른"방법으로 일반적인 UI 항목을 채우기 위해 DB로 왕복 할 필요가 없습니다. 이를 위해 EF 객체 저장을 권장하지 않습니다. 캐시하는 POCO 개체 (보기 모델 또는 유사)를 만들 것입니다. 마지막으로

List<State> states = Context.StateData.Select(s => new State { Abbreviation = s.Abbreviation, Name = s.Name}).ToList(); 

, 캐싱 솔루션이 무엇이든 :

public class State 
{ 
    public string Abbreviation { get; set; } 

    public string Name { get; set; } 
} 

는 그런 다음 캐시 된 목록을 만들려면이 같은 일을 할 것입니다 : 그래서 50 개 주의 예에서이 같은있을 수 있습니다 테스트를 위해 캐싱 메소드를 모의 할 수 있도록 인터페이스를 구현해야합니다. 당신의 POCO 객체와 인터페이스 데이터를 수행 할 클래스 라이브러리를 정의하는

귀하의 MVC 응용 프로그램 클래스 라이브러리 :

는 순환 참조로 실행 중이거나, 최소한 3 어셈블리가 필요합니다 반사를 사용하지 않고이 작업을 수행하려면 액세스 및 캐싱 (이 분명히 그것이 쉽게 유지할 수있는 경우 2 라이브러리로 분할 및/또는 테스트 할 수 있습니다)

당신이 당신의 MVC 코드 같은 것을 가질 수있는 방법 :

ICache myCache = CacheFactory.CreateCache(); 
List<State> states = myCache.ListStates(); 
// populate your view model with states 

ICache와 State는 하나의 라이브러리에 있고 ICache의 실제 구현은 다른 라이브러리에 있습니다.

이것은 내 표준 아키텍처를 위해 수행 한 작업입니다. POCO 개체와 데이터 액세스에 관계없는 인터페이스를 별도의 라이브러리 (데이터 액세스는 별도의 MVC 앱)로 분할합니다.

+0

기술적으로 POCO 클래스를 데이터 액세스 계층의 캐싱 메커니즘 인터페이스에 넣을 수 있습니다. 그런 다음 MVC 응용 프로그램에서 캐싱을 구현하고 인터페이스를 구현하고 데이터 액세스 레이어에 다음과 같이 전달할 수 있습니다. dataLayer.LoadStates (myCache) 여기서 ICache는 상태 목록을 채울 수있는 속성이나 메서드를 제공합니다. . –

0

유니티, ninject, 구조체 맵과 같은 의존성 삽입 도구를 사용하십시오. 이것들은 여러분이 찾고있는 것과 매우 비슷한 방법으로 객체를 유지하는 커널을 구현함으로써 찾고있는 어플리케이션 레벨 컨트롤을 허용합니다 묘사하는 것처럼 보입니다.

+0

내 프로젝트에서 Ninject를 사용하고 있습니다. 하지만 DI가 애플리케이션 수준에서 데이터 캐싱과 관련이 있다고 생각하지 않았습니다. 그게 내가 잘못한거야? –

관련 문제