2013-03-07 2 views
2

데이터베이스에 저장된 일부 데이터에 액세스하는 WCF 서비스를 설계하고 있습니다.데이터에 액세스하는 WCF 서비스의 적절한 디자인

DB에 대한 실제 액세스는 일부 ORM 계층에서 처리됩니다 (현재 NHibernate이지만 구현 세부 사항 임).

이런 종류의 시나리오에 적합한 디자인이 무엇인지 궁금합니다.

순진 접근 것 같은 뭔가 :

public class ServiceImplementation : IService 
{ 
    // NHibernate session 
    private ISession session; 

    // service methods that use *session* 
} 

이 NHibernate에 특이 적으로 결합 및 초기화와 ORM 로직 코드를 소유를 관리하는 서비스 클래스를 강제한다.

내 질문은 특히 다음과 같습니다

  • 가 어떻게 서비스가 DB/ORM 층에서 분리 된 분리 된 디자인을 달성 하는가?
  • 은 db 액세스/ORM 계층을 초기화해야합니까? 서비스가 관리합니까?

이것은 일반적인 시나리오이므로 일부 "패턴"/ 모범 사례가 있다고 가정합니다.

온라인에서 사용할 수있는 대부분의 예제는이를 달성하는 방법 (DB 액세스 등을 위해 ORM을 사용하는 방법)을 보여 주지만 더 큰 규모의 설계 관점에서 올바르게 수행하는 방법을 설명하지는 않습니다. 여러으로, 이것은 메모리의 단일 인스턴스를 보유하는 서비스의 원인이됩니다

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Multiple)] 

: 한 번만 초기화 할 가정

답변

1

, 다음과 같은 속성을 가진 서비스 구현 클래스를 설정하는 것을 고려할 수 있습니다 호출자는 해당 인스턴스에 모두 액세스합니다. 단점은 코드가 스레드로부터 안전해야한다는 것입니다. 또한 두 번째 WCF 서비스에 전화를 걸 수 없습니다 (이 경우 재진입 성의 동시성이 필요합니다).

그러나이 시나리오에서는 서비스의 DB/ORM 측면을 제어하는 ​​클래스 인스턴스를 보유하여 원하는 결합 해제를 달성 할 수 있습니다.

DB/ORM의 초기화는 서비스의 생성자에서 수행 할 수 있습니다.

DB/ORM 기능을 포함하는 정적 멤버 변수를 사용하는 것은 현명한 방법이 아닙니다. 그 이유는 충분한 비활성 기간이 주어지면 서비스 호스트가 정적 값을 다시 확보 할 수 있기 때문입니다.

이것은 물론 원하는 것을 달성하는 유일한 방법입니다. 다중 초기화 비용을 P.I.A와 비교해보십시오. 스레드 안전 코드 작성. 하나의 사용자 세션은 ORM을 한 번만 초기화하여 사용자가 여러 번 호출 할 가능성이있는 경우 초기화 작업을 줄입니다. 세션을 정의하고 제어하는 ​​데 소요되는 오버 헤드는 기껏해야 사소한 자극이며, 이미 오랫동안 머물러있는 동안이 반응의 범위를 벗어납니다.

+0

이미 ContextMode를 single로 설정했습니다 (가장 이상적인 선택인지는 확실하지 않음).내 서비스에서 NHibernate의 클래스 인스턴스를 유지하는 것은 어떻게 분리 된 디자인을 얻는가? –

+0

클래스를 생성하고 클래스에 모든 ORM 초기화 코드를 넣고 필요에 따라 쿼리하면 클래스가 분리됩니다. –