代码之家  ›  专栏  ›  技术社区  ›  Shaul Zuarets

GC如何与中的DI一起工作。净核心2

  •  2
  • Shaul Zuarets  · 技术社区  · 7 年前

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

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

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

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

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

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

    这种情况让我思考,垃圾收集器如何处理这种情况?

    谢谢 沙乌尔

    1 回复  |  直到 7 年前
        1
  •  4
  •   omajid    7 年前

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

    在第一种方法中,通过 new . 结束 using Dispose 在它上面,释放任何非内存资源。当对象超出范围时,GC可以看到它没有被使用,并随时回收它。

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

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

    不过,一般来说,这不是您应该尝试和优化的内容,除非您知道这会导致性能问题。首先为开发者优化。