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()
을 테스트하기 위해 나를 수 있었다.
이제 몇 가지 질문은 나에게 와서 :
- IIS 내에서
MyService
여러 독립적 인 경우가 있습니다 또는 IIS 생성 않고MyService
(싱글의 일종)의 단 하나 개의 인스턴스를 잡아? - 하나의 인스턴스가 활성 상태 인 경우 : 내 리팩터링 클래스 (
TestDbContext
인스턴스 필드)에있는 기본 데이터베이스 연결TestDbContext
이 닫히거나 IIS 내의 서비스가 중지 될 때까지 열려 있습니까? - 여러 인스턴스가있는 경우 :
MyService
에 대한 각 웹 요청은TestDbContext
의 새 인스턴스 생성을 의미합니까? 아니면보다 정교한 논리입니까?
이러한 모든 사항은 하나의 필수 질문으로 요약 할 수 있습니다. 리팩터링을 사용하여 제품을 저장 (읽기 및 쓰기)하거나 이상한 현상이 발생하여이 패턴을 피할 수 있습니까?
특히 다음 두 글은 나를 나의 접근 방식이 안전 할 수 있다는 느낌 :
Microsoft testing sample ->이 생산적인 사용하기에 적합하지 않은 경우 왜 그러한 예를 작성해야합니까?
Should Entity Framework Context be Put into Using Statement? -> 사용하지 않고도 데이터베이스 연결이 닫힌 것처럼 보이지만 누구에 의해 종료 되었습니까?
나는 귀하의 답변에 매우 흥미가 있습니다.
추신 : 코드에 너무 많은주의를 기울이지 마십시오. 단지 샘플에 불과합니다. 제작 코드 내에서 작업이 더 복잡합니다. 질문은 근본적인 "마술", 장면 뒤에서 일어나는 일과 분명히 더 관련이 있습니다.
이것에 대한 아이디어가 있으십니까? 최소한 가정은 요? – mu88