【问题标题】:ASP.NET Core 2.0 service life timeASP.NET Core 2.0 服务生命周期
【发布时间】:2019-09-17 15:20:22
【问题描述】:

我有 api 应用程序、服务和存储库类库应用程序。服务部分我编写业务逻辑和存储库只为数据库通信。我的问题是哪种类型的依赖最适合存储库和服务。

services.AddScoped<ITicketRepository, TicketRepository>();
services.AddTransient<ITicketRepository, TicketRepository>();
services.AddSingleton<ITicketRepository, TicketRepository>();

【问题讨论】:

  • 如果有选择它必须依赖,那么场景是什么?

标签: c# asp.net-core-2.0


【解决方案1】:

像往常一样,这取决于。我的建议如下:

  • Scoped:在我看来,使用它可能有两个主要原因:
    • 您的依赖项有一个具有作用域生命周期的依赖项。在这种情况下,您不能使用单例,但可以使用作用域或瞬态。您应该选择哪一个取决于其他标准。
    • 您的依赖项有一些状态使其不适合在单例范围内使用,但它足够重,您不想将其注册为瞬态。另一种可能性是,同样,它不能在单例范围内使用,但是每个请求(范围)共享相同的实例是可以的,如果两种类型依赖于相同的类型,您不希望增加构造新实例的开销thing 并且它们都用于服务单个请求。
  • 瞬态:这是最简单的方法。每次需要以这种方式注册的依赖项实例时,都会创建一个新实例。这可能是最简单的方法,但如果使用不合理,可能会导致严重的开销。 @Tony Ngo 在他的回答中指出,引用官方文档,这对轻量级、无状态对象最有效,但我认为无状态是一个非常好的指标,您可能希望使用单例生命周期,因为无状态保证了同一个对象可以同时使用就好了。在这种情况下,您是选择瞬态生命周期还是单例生命周期实际上取决于您是否关心诸如 GC 成本之类的性能方面,如果您每次需要这种依赖关系时都创建一个新实例,这显然要高得多,即使您可以避免这样做。话虽如此,许多开发人员也在这种情况下使用瞬态,可能是因为它的万无一失,或者仅仅是因为他们倾向于将其视为默认选择。
  • Singleton:以上几点基本上总结了这一点:当绝对没有理由为每个请求(范围)创建依赖项的新实例或使用其他依赖实例时,您可以选择此选项。请注意,如前所述,当类型具有注册为作用域的依赖项时,您不能使用单例生存期。

【讨论】:

    【解决方案2】:

    每次都会创建瞬态生命周期服务(AddTransient) 它们是从服务容器请求的。此生效果最好 用于轻量级、无状态的服务。

    范围内的生命周期服务 (AddScoped) 为每个客户端创建一次 请求(连接)。

    单例生命周期服务(AddSingleton)是第一次创建的 他们被请求(或者当 Startup.ConfigureServices 运行并且 实例由服务注册指定)。

    所以根据您的需要,您可以选择正确的liftetime,您可以查看更多here

    【讨论】:

      【解决方案3】:

      我假设您的 TicketRepository 取决于您的 EF Core DbContext 和您的 EF Core DbContext 默认注册为ScopedSerivce 所以这里将TicketRepository 注册为SingletonService 是不考虑的,因为:

      从单例解析作用域服务是很危险的。可能导致服务在处理后续请求时状态不正确。

      更多详情:Dependency injection in ASP.NET Core-Service lifetimes

      现在您可以在AddTransient&lt;&gt;AddScoped&lt;&gt; 之间进行选择,其中:

      每次从服务容器请求时都会创建瞬态生命周期服务 (AddTransient)。这个生命周期最适合轻量级、无状态的服务。

      范围生命周期服务 (AddScoped) 为每个客户端请求(连接)创建一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-27
        • 1970-01-01
        • 2023-01-22
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多