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

肖尔·祖亚雷斯(Shaul Zuarets)

通常在使用实体框架时,我使用的是“ 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;
}

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

谢谢,肖尔

奥马吉德

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

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

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

换句话说,没有简单的答案。对于经常使用的资源,与按显式调用new+相比,将DI与按方法调用的生命周期一起使用Dispose将涉及相似的工作量。对于其他类型的使用,这将取决于您在做什么以及对您的用例而言“会更好”。

通常,这不是您应该尝试优化的事情,除非您知道这会导致性能问题。首先针对开发人员进行优化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章