ASP.NET DbContext实例注入但未使用 - 性能问题与否?

时间:2017-09-25 18:04:49

标签: asp.net asp.net-mvc entity-framework dependency-injection asp.net-core

最新方法说明了将DbContext实例权限注入MVC​​ \ WebAPI控制器。它有一些专业人士,但我有一个问题尚未得到解答 - 不会使用DbContext实例创建的性能。

根据这个问题:What happens when i instantiate a class derived from EF DbContext? DbContext创建并不是那么便宜的操作(内存和CPU)。并且它在以下情况下两次糟糕:

  1. 您的操作根本不需要DbContext(因此您可以使用混合操作而不使用数据库)
  2. 某些逻辑(例如条件)不允许访问DbContext(e.q。ModelState.IsValid)。因此,操作将在访问DbContext实例之前返回结果。
  3. 因此,在两者(可能是其他一些情况)中,DI创建了DbContext的范围实例,浪费了它上面的资源,然后在请求结束时收集它。

    我没有进行任何性能测试,只是搜索了一些文章第一。我不是说它会100%缺乏性能。我只是想:" 嘿嘿,如果我不打算使用它,你为什么要创建对象的实例"。

2 个答案:

答案 0 :(得分:2)

  

如果我不使用它,为什么要创建对象的实例   一点都不。

Mark Seemann在他的书Dependency Injection in .NET中说,“创建一个对象实例是.Net Framework非常快的。你的应用程序可能出现的任何性能瓶颈都会出现在其他地方,所以不要担心它。“

请注意 Dbcontext默认启用延迟加载 。只是通过实例化它,它对性能没有太大影响。所以,我不担心Dbcontext。

但是,如果你有一些自定义类在构造函数中进行繁重的工作,那么你可能需要考虑重构它们。

如果你真的想要比较性能,可以用Lazy包装这些依赖项,看看你获得了多少性能。 Does .net core dependency injection support Lazy

答案 1 :(得分:0)

您可以将其注册为Lazy或者您可以执行我所做的操作并注入IMyDbContextFactory然后您可以调用Create(),它将在您实际需要时返回DbContext(具有自己的优点/缺点)。如果构造函数没有做任何事情,那么它不会成为一个巨大的打击,但请记住,它第一次被新建,它将击中经过的静态构造函数并进行所有模型验证。这次打击只发生一次,但却是一个巨大的打击。