【发布时间】:2016-09-01 13:04:21
【问题描述】:
我是 WCF 服务和实体框架 6 领域的新手,这就是我遇到一个非常基本的问题的原因。我有一个 WCF 服务,通过 Entity Framework 6 从 SQL Server 数据库提供数据。为此,在服务中定义了几个操作。该服务托管在 IIS 中。
由于有几个教程和博客,我遵循了在using-statement 中为每个操作创建我的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作为实例字段)是否会关闭,还是会保持打开状态直到 GC/IIS 中的服务停止? - 如果有多个实例:对
MyService的每个Web 请求是否意味着创建TestDbContext的新实例,还是有更复杂的逻辑?
所有这些要点都可以总结为一个基本问题:我的重构是为了生产(读写)还是我可以遇到奇怪的现象并避免这种模式?
尤其是下面的两篇帖子让我觉得我的方法可能是安全的:
Microsoft testing sample --> 如果不适合生产用途,他们为什么要创建这样的示例?
Should Entity Framework Context be Put into Using Statement? --> 即使没有 using 语句,数据库连接似乎也关闭了,但是谁关闭的?
我对你的答案很感兴趣!
PS:请不要太关注代码,它只是一个示例。在我的生产代码中,操作更加复杂。这个问题肯定与潜在的“魔法”、幕后发生的事情等有关。
【问题讨论】:
-
对此有什么想法吗?至少是假设?
标签: c# entity-framework wcf iis testing