【问题标题】:Extract DbContext into instance field within WCF service将 DbContext 提取到 WCF 服务中的实例字段中
【发布时间】: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()

现在我遇到了几个问题:

  1. 在 IIS 中是否有多个独立的 MyService 实例,或者 IIS 是否只创建并保存了一个 MyService 实例(某种单例)?
  2. 如果有一个实例保持活动状态:我重构的类中TestDbContext 的底层数据库连接(TestDbContext 作为实例字段)是否会关闭,还是会保持打开状态直到 GC/IIS 中的服务停止?
  3. 如果有多个实例:对MyService 的每个Web 请求是否意味着创建TestDbContext 的新实例,还是有更复杂的逻辑?

所有这些要点都可以总结为一个基本问题:我的重构是为了生产(读写)还是我可以遇到奇怪的现象并避免这种模式?

尤其是下面的两篇帖子让我觉得我的方法可能是安全的:

我对你的答案很感兴趣!

PS:请不要太关注代码,它只是一个示例。在我的生产代码中,操作更加复杂。这个问题肯定与潜在的“魔法”、幕后发生的事情等有关。

【问题讨论】:

  • 对此有什么想法吗?至少是假设?

标签: c# entity-framework wcf iis testing


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多