将DbContext解压缩到WCF服务

时间:2016-09-01 13:04:21

标签: c# entity-framework wcf iis testing

我是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()

现在有几个问题出现在我面前:

  1. IIS中是否存在多个MyService的独立实例,或者IIS是否只创建并保存了MyService(某种单例)的一个实例?
  2. 如果有一个实例保持活动状态:我的重构类(TestDbContext中的TestDbContext作为实例字段)的基础数据库连接是否会被关闭,或者它将保持打开状态,直到GC /服务内部IIS停止了吗?
  3. 如果有多个实例:对MyService的每个Web请求是否意味着创建了TestDbContext的新实例,或者是否存在更复杂的逻辑?
  4. 所有这些要点都可以归纳为一个基本问题:我的重构是为了生产(读写)还是我可以遇到奇怪的现象并避免这种模式?

    特别是以下两篇帖子让我觉得我的方法很安全:

    我对你的答案很感兴趣!

    PS:请不要过多关注代码,这只是一个示例。在我的生产代码中,操作更复杂。这个问题肯定与底层&#34;魔术&#34;,幕后发生的事情等有关。

1 个答案:

答案 0 :(得分:0)

在另一个论坛中,我们找到了另一种结合两者的方法(可测试代码和安全代码)。这是我的解决方案:https://social.msdn.microsoft.com/Forums/en-US/wcf/thread/69705868-3c86-4fa6-b5c5-7b79e67ce283/#d777ff90-af9a-474a-b9b0-fbf46f799174