GC如何在.Net Core 2中使用DI



通常在使用实体框架时,我会使用"using"子句:

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

现在,我们已经将我们的平台迁移到.Net Core(2)中,由于有一个很棒的DI机制,我们决定使用它

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

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

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

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

谢谢,Shaul

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

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

在DI方法中,生命周期由DI框架管理。DI框架将分配它和Dispose。DI框架可以在应用程序的整个生命周期中分配一次,每次调用DI支持方法或两者之间的任何方法都可以分配一次。因此,寿命可能更长,并且可能更长。如果对象的寿命更长,则意味着.NET Core运行时系统分配和回收对象的频率更低。它做的工作更少。但这意味着对象资源的使用时间更长:与数据库的连接和任何句柄都将保留更长时间。例如,如果你在应用程序的生命周期中没有只使用数据库一次,并且在整个生命周期中都保持活动状态,那么你就是在浪费你不需要的资源。

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

不过,一般来说,这不是你应该尝试和优化的事情,除非你知道这会导致性能问题。首先为开发人员进行优化。

最新更新