2016-09-26 4 views
0

정보의 읽기 전용 리포지토리에 액세스해야하는 WCF 서비스가 있습니다. 이 저장소는 작성하는 데 비용이 많이 들며, 이는 일단 작성되어 서비스 클래스/서비스 인스턴스간에 공유되어야 함을의 L합니다. 클래스 스레드를 일반적으로 안전하게 만드는 것은 문제가되지 않으며 리포지토리 스레드를 안전하게 만듭니다. "다중"수동으로 하나의 서비스 개체를 생성하고 단일 저장소가 주입하도록WCF의 공유 읽기 전용 데이터 - InstanceContextMode 선택

  1. 간단하게 설정 "InstanceContextMode"에서 "싱글"와 "들면, ConcurrencyMode"나는 respository 공유를위한 두 가지 옵션을 고려하고 생성자를 통해.

  2. "PerCall"(또는 "PerSession")으로 설정된 "InstanceContextMode"를 사용하고 내 서비스에 대한 사용자 지정 서비스 인스턴스 공급자를 구현하십시오. 이 인스턴스 제공자는 작성 프로세스의 일부로 모든 서비스 클래스 인스턴스 (생성자)에 저장소의 단일 인스턴스를 삽입 할 수 있습니다.

내 상황에서 옵션 1을 사용하지 않은 이유는 무엇입니까 (충분한 정보를 제출했다면)? 나에게 그것은 가장 쉬운 것 같다? 나는 "InstanceContextMode"가 "Single"로 설정된 것이 성능/확장성에 좋지 않다는 것을 읽지 만 이것이 항상 경우인지 또는 서비스 등록 정보에 의존하는지는 파악하지 못합니다.

이미 언급했듯이 내가 답변 할 수있는 특정 사례에 대한 충분한 정보를 제공하지 못했을 수도 있습니다.

안부, 요한

답변

0

정보의 읽기 전용 저장소에 액세스 할 필요가 WCF 서비스. 이 저장소는 생성하는 데 비용이 많이 들며 한 번 생성되어 서비스 클래스/서비스 인스턴스간에 공유되어야합니다.

위의 시나리오는 캐싱 메커니즘을 사용해야하는 경우가 더 많습니다. "InstanceContextMode"를 사용해야하는 상황.

따라서 MemoryCache을 사용하여이를 수행 할 수 있어야합니다. 읽기 전용 객체를 메모리 캐시에로드하고 동시 웹 서비스 호출간에 안전하게 공유 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 솔루션 # 2 (여러 인스턴스)와 동일한 주제로 좋은 대안처럼 들립니다. 하지만 # 1이 나쁜 해결책이고 여전히 그렇다면 여전히 관심이 있습니다 : 왜? 내게는 그 부분을 이해하는 것이 중요합니다. –

+0

# 1은 서비스가 하나의 스레드가되기 때문에 # 1은 나쁘다. 여러 시스템이나 장치에서 액세스 할 수있는 API에서이 패턴을 사용하면 API가 사실상 사용할 수 없게됩니다. MSDN에 따르면 _Single : 각 인스턴스 컨텍스트는 한 번에 인스턴스 컨텍스트에서 최대 하나의 스레드 처리 메시지를 가질 수 있습니다. 동일한 인스턴스 컨텍스트를 사용하고자하는 다른 스레드는 원래 스레드가 인스턴스 컨텍스트를 빠져 나올 때까지 차단해야합니다 ._ –

+0

"ConcurrencyMode"에 대한 설명과 해당 설정에 대한 "Single"옵션이 아닌가요? # 1에서 "ConcurrencyMode"를 "Multiple"로 설정하고 "InstanceContextMode"를 "Single"로 설정하려고합니다. 나에게 그것은 단일 객체가 모든 서비스 호출을 제공하는 데 사용될 것이며 그 단일 객체는 여러 호출에 의해 동시에 사용될 것임을 의미합니다. 이것은 물론 스레드 동기화를 요구합니다. –

관련 문제