我是WCF服务和实体框架6领域的新手,这就是为什么一个非常基本的问题出现在我身上的原因。我有一个WCF服务通过Entity Framework 6从SQL Server数据库提供数据。为此,在服务中定义了几个操作。该服务托管在IIS中。
由于有几个教程和博客,我遵循了在DbContext
语句中为每个操作创建using
实例的模式。所以看起来或多或少是这样的:
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()
。
现在有几个问题出现在我面前:
MyService
的独立实例,或者IIS是否只创建并保存了MyService
(某种单例)的一个实例?TestDbContext
中的TestDbContext
作为实例字段)的基础数据库连接是否会被关闭,或者它将保持打开状态,直到GC /服务内部IIS停止了吗?MyService
的每个Web请求是否意味着创建了TestDbContext
的新实例,或者是否存在更复杂的逻辑?所有这些要点都可以归纳为一个基本问题:我的重构是为了生产(读写)还是我可以遇到奇怪的现象并避免这种模式?
特别是以下两篇帖子让我觉得我的方法很安全:
Microsoft testing sample - &gt;如果它不适合生产用途,他们为什么要创造这样的例子呢?
Should Entity Framework Context be Put into Using Statement? - &gt;即使没有using语句,数据库连接似乎也会被关闭,但由谁来管理?
我对你的答案很感兴趣!
PS:请不要过多关注代码,这只是一个示例。在我的生产代码中,操作更复杂。这个问题肯定与底层&#34;魔术&#34;,幕后发生的事情等有关。
答案 0 :(得分:0)
在另一个论坛中,我们找到了另一种结合两者的方法(可测试代码和安全代码)。这是我的解决方案:https://social.msdn.microsoft.com/Forums/en-US/wcf/thread/69705868-3c86-4fa6-b5c5-7b79e67ce283/#d777ff90-af9a-474a-b9b0-fbf46f799174