通常在使用实体框架时,我使用的是“ 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;
}
这种情况让我开始思考,垃圾收集器如何处理这种情况?在性能方面与第一种方法有区别吗?内存泄漏?等等
谢谢,肖尔
生命周期方面肯定存在差异。
在第一种方法中,您通过创建对象(并分配内存以及它需要的任何其他资源)new
。using
块的末尾将调用Dispose
它,释放所有非内存资源。当对象超出范围时,GC可以看到该对象未被使用,并可以随时对其进行回收。
在DI方法中,生命周期由DI框架管理。DI框架将对其进行分配Dispose
。DI框架可以在应用程序的整个生命周期中分配一次,每次调用DI支持方法一次或两次之间进行分配。因此,寿命可能更长,并且可能会更长。如果对象的生存时间更长,则意味着.NET Core运行时系统分配它的频率降低了,并且回收了它的频率降低了。它的工作量较少。但这意味着对象资源的使用时间会更长:与数据库的连接以及所有句柄的保留时间会更长。例如,如果在应用程序的生命周期中不只使用一次db,并且在整个生命周期中都将其保持活动状态,那么您就是在浪费不需要的资源。
换句话说,没有简单的答案。对于经常使用的资源,与按显式调用new
+相比,将DI与按方法调用的生命周期一起使用Dispose
将涉及相似的工作量。对于其他类型的使用,这将取决于您在做什么以及对您的用例而言“会更好”。
通常,这不是您应该尝试优化的事情,除非您知道这会导致性能问题。首先针对开发人员进行优化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句