通常在使用实体框架时,我会使用"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将需要类似的工作量。对于其他类型的用途,这将取决于您正在做什么以及什么对您的用例"更好"。
不过,一般来说,这不是你应该尝试和优化的事情,除非你知道这会导致性能问题。首先为开发人员进行优化。