Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么时候处置Web API中的_db连接_C#_Asp.net Web Api2_Dispose - Fatal编程技术网

C# 什么时候处置Web API中的_db连接

C# 什么时候处置Web API中的_db连接,c#,asp.net-web-api2,dispose,C#,Asp.net Web Api2,Dispose,我已经读了很多关于垃圾收集和使用IDisposable通过实体框架处理连接的书。我知道我应该在处理完资源后尽快处理它们,但我还没有看到很多好的例子,比如什么时候应该打电话,从哪里打电话,以及希望确保我正确处理这些问题 假设我从一个web API调用返回一个基本清单列表。我的假设是,我应该在得到列表后立即调用dispose方法。这是正确的吗?例如,让我们看一下服务层中的以下方法: public class ServiceLayer { private InventoryContext _d

我已经读了很多关于垃圾收集和使用IDisposable通过实体框架处理连接的书。我知道我应该在处理完资源后尽快处理它们,但我还没有看到很多好的例子,比如什么时候应该打电话,从哪里打电话,以及希望确保我正确处理这些问题

假设我从一个web API调用返回一个基本清单列表。我的假设是,我应该在得到列表后立即调用dispose方法。这是正确的吗?例如,让我们看一下服务层中的以下方法:

public class ServiceLayer
{
    private InventoryContext _db = new InventoryContext();

    public List<Inventory> GetFullInventoryList()
    {
        var inventoryList = _db.Inventory.ToList();

        _db.Dispose();

        return inventoryList;
    }

    public Inventory GetInventoryRecordById(int id)
    {
        var inventoryRecord = _db.Inventory
            .Where(y => y.Id == id)
            .First();

        _db.Dispose();

        return inventoryRecord;
    }
}
这是处置资源的正确方法吗?如果没有,应在何时调用?如果它是正确的,但不是适当的方式,那么什么是适当的方式


谢谢

有几个选项可用,但它们都遵循一个共同的规则:上下文的所有者创建它的人也应该处理它

你可以:

在服务方法中创建上下文,并在同一方法中处置它:

public List<Inventory> GetFullInventoryList()
{
    using (var _db = new InventoryContext())
    {
        return _db.Inventory.ToList();
    }
}
在服务类中创建上下文,然后需要使类IDisposable并实现。这更复杂,因此仅当您需要调用多个服务方法(每个服务方法都与数据库一起工作)时才使用它

使用依赖项注入为控制器提供上下文。在这种情况下,将在容器中注册上下文时配置上下文的生存期,并且容器将在您的上下文上调用dispose(例如Autofac或Windsor),假设您在容器或其生存范围上调用dispose,则执行此操作。你可以用生活方式来做这个。
Google搜索dbcontext dispose会发现这个->我是否总是必须对dbcontext对象调用dispose?不:谢谢,彼得,我知道你不必这么做,但我认为,正如作者所说的,大多数人认为你应该处理掉它。什么是\u db?你能用using语句把它包装起来吗?两全其美。这肯定是不对的。若您想在查询之后立即处理它—这很好,但在查询之前创建它。在您的示例中_db是一个在其他地方初始化的字段。谢谢PeteGO&@Evk-我为上下文添加了一些额外的代码来向您展示。这就是我通常构建服务层的方式。控制器调用服务层,服务层有一个私有的_db变量,它代表我正在使用的数据库上下文!这很有道理。很多例子倾向于依赖注入。有什么原因吗?@serpent5,非常感谢,在你编辑之后,答案看起来好多了@Clouse24,一般来说,DI是软件工程中的最佳实践,它可以提高您的可测试性、可维护性、减少耦合,并支持其余的可靠原则。在现代应用程序中,使用IoC容器是事实上的标准。查一下,它真的很有用。祝你好运