GC如何与.Net Core 2中的DI配合使用

时间:2017-11-15 16:49:41

标签: c# .net asp.net-core garbage-collection .net-core

通常在使用实体框架时,我使用的是“using”子句:

using (var db = new dbcontext())
{
    var blabla = db.table.tolist();
}

现在,我们已将我们的平台迁移到.Net Core(2),因为有一个很好的DI机制,我们决定使用它。现在,我们不是使用上面的方法,而是将dbcontext作为构造函数中的参数:

public MeaningfullNameController(dbcontext db)
{
    this.db = db;
}

当另一个类需要使用dbcontext时,我们只是在第二个类的构造函数中传递上面的dbcontext。

public class NewClass(dbcontext db)
{
    this.db = db;
}

这种情况让我想到,垃圾收集器如何处理这种情况? 在性能方面与第一种方法有区别吗?内存泄漏?等

谢谢, 沙乌尔

1 个答案:

答案 0 :(得分:3)

在生命周期方面肯定存在差异。

在第一种方法中,您可以通过new创建对象(并分配内存以及所需的任何其他资源)。 using块的末尾将调用Dispose,释放任何非内存资源。当对象超出范围时,GC可以看到它没有被使用并随时回收它。

在DI方法中,生命周期由DI框架管理。 DI框架将分配它并Dispose它。 DI框架可以在应用程序的整个生命周期中分配一次,每次调用DI支持方法或其间的任何内容。因此,寿命可能更长并且可能更长。如果对象存在较长时间,则意味着.NET Core运行时系统已经较少地分配它并且不太经常地回收它。它的工作量减少了。但这意味着对象资源的使用时间更长:与数据库的连接和任何句柄都将保持更长时间。如果您不是仅使用数据库一次,例如,在应用程序的生命周期中,并且在整个生命周期中保持活动状态,那么您只是浪费了您不需要的资源。

换句话说,没有一个简单的答案。对于经常使用的资源,与明确调用new + Dispose相比,使用具有每方法调用生命周期的DI将涉及类似的工作量。对于其他类型的用途,它将取决于您正在做什么以及什么将更好"为您的用例。

一般情况下,除非您知道这会导致性能问题,否则您不应该尝试优化这些内容。首先针对开发人员进行优化。