首页 > 解决方案 > ASP.NET Core 2.0 服务生命周期

问题描述

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

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

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

解决方案


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

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

推荐阅读