2016-09-01 3 views
0

WCF 서비스 및 Entity Framework 6 분야에서 새로 생겼습니다. 그래서 매우 근본적인 질문이 내게 다가 왔습니다. Entity Framework 6을 통해 SQL Server 데이터베이스의 데이터를 제공하는 WCF 서비스가 있습니다.이를 위해 서비스 내에 정의 된 몇 가지 작업이 있습니다. 이 서비스는 IIS 내에서 호스팅됩니다. 여러 가지 자습서와 블로그로 인해 using- 문구 내에서 작업 당 내 DbContext 인스턴스를 만드는 패턴을 따랐습니다. 그래서 더 많거나 적은 같은 같습니다 WCF 서비스 내 인스턴스 필드에 DbContext 추출

public class MyService 
{ 
    public List<HouseDto> GetHouses() 
    { 
     var houseDtos = new List<HouseDto>(); 

     using (var context = new TestDbContext()) 
     { 
      var houses = context.Houses.ToList(); 
      foreach (var house in houses) 
      { 
       var houseDto = house.ToDto(); 
       houseDtos.Add(houseDto); 
      } 
     }  

     return houseDtos; 
    } 

    public List<StreetDto> GetStreets() 
    { 
     var streetDtos = new List<StreetDto>(); 

     using (var context = new TestDbContext()) 
     { 
      var streets = context.Streets.ToList(); 
      foreach (var street in streets) 
      { 
       var streetDto = street.ToDto(); 
       streetDtos.Add(streetDto); 
      } 
     }  

     return streetDtos; 
    } 
} 

가 지금은 서비스 운영 GetHouses()을 테스트 할 수 있습니다. 이를 위해, 나는 인스턴스 필드로 TestDbContext 데의 방법으로 클래스를 리팩토링 :

public class MyService 
{ 
    private TestDbContext context; 

    public MyService() 
    { 
     context = new TestDbContext(); 
    } 

    internal MyService(TestDbContext context) 
    { 
     this.context = context; 
    } 

    public List<HouseDto> GetHouses() 
    { 
     var houseDtos = new List<HouseDto>(); 

     var houses = context.Houses.ToList(); 
     foreach (var house in houses) 
     { 
      var houseDto = house.ToDto(); 
      houseDtos.Add(houseDto); 
     }  

     return houseDtos; 
    } 

    public List<StreetDto> GetStreets() 
    { 
     var streetDtos = new List<StreetDto>(); 

     var streets = context.Streets.ToList(); 
     foreach (var street in streets) 
     { 
      var streetDto = street.ToDto(); 
      streetDtos.Add(streetDto); 
     } 

     return streetDtos; 
    } 
} 

이는 조롱 TestDbContext를 주입하고 전체 서비스 운영뿐만 아니라 DTO 생성 방법 ToDto()을 테스트하기 위해 나를 수 있었다.

이제 몇 가지 질문은 나에게 와서 :

  1. IIS 내에서 MyService 여러 독립적 인 경우가 있습니다 또는 IIS 생성 않고 MyService (싱글의 일종)의 단 하나 개의 인스턴스를 잡아?
  2. 하나의 인스턴스가 활성 상태 인 경우 : 내 리팩터링 클래스 (TestDbContext 인스턴스 필드)에있는 기본 데이터베이스 연결 TestDbContext이 닫히거나 IIS 내의 서비스가 중지 될 때까지 열려 있습니까?
  3. 여러 인스턴스가있는 경우 : MyService에 대한 각 웹 요청은 TestDbContext의 새 인스턴스 생성을 의미합니까? 아니면보다 정교한 논리입니까?

이러한 모든 사항은 하나의 필수 질문으로 요약 할 수 있습니다. 리팩터링을 사용하여 제품을 저장 (읽기 및 쓰기)하거나 이상한 현상이 발생하여이 패턴을 피할 수 있습니까?

특히 다음 두 글은 나를 나의 접근 방식이 안전 할 수 있다는 느낌 :

나는 귀하의 답변에 매우 흥미가 있습니다.

추신 : 코드에 너무 많은주의를 기울이지 마십시오. 단지 샘플에 불과합니다. 제작 코드 내에서 작업이 더 복잡합니다. 질문은 근본적인 "마술", 장면 뒤에서 일어나는 일과 분명히 더 관련이 있습니다.

+0

이것에 대한 아이디어가 있으십니까? 최소한 가정은 요? – mu88

답변

관련 문제