ASP.NET Core Singleton实例与瞬态实例的性能 - c#

在ASP.NET Core依赖注入中,我只是想知道注册Singleton实例是否会比注册Transient实例更好地提高性能?

在我看来,对于Singleton实例,创建新对象和相关对象只需花费一次时间。对于Transient实例,此成本将针对每个服务请求重复。因此Singleton似乎更好。但是,在Singleton上使用Transient时,我们可以获得多少性能?谢谢高级!

参考方案

就像其他人所说的那样,性能不应该在这里做出决定:无论哪种方式,性能都不会受到重大影响。您应该考虑的是托管和非托管的依赖项。当您利用有限的资源(例如套接字和连接)时,单例是最好的。如果最终每次注入服务(临时)都不得不创建一个新的套接字,那么您将很快用光套接字,那么性能确实会受到影响。

当资源使用是临时的并且影响最小时,临时范围会更好。例如,如果您仅在进行计算,则可以进行瞬态作用域分析,因为您不会因为拥有多个副本而耗尽任何资源。

当状态很重要时,您还想使用单例作用域。如果某件事需要经过一项特定的操作之后,则暂态将不起作用,因为您将没有状态,因为它基本上会在每次注入时开始。例如,如果您尝试使用信号量锁定来协调并发队列,那么您肯定需要单例作用域服务。如果状态无关紧要,则瞬态可能是更好的范围。

最后,您必须查看您的服务所依赖的其他服务。如果您需要访问作用域服务(例如基于请求范围的服务),那么单例是不合适的。虽然您可以使用服务定位器模式来访问作用域服务,但这是虚假的,不建议这样做。基本上,如果您的服务使用除其他单例服务以外的任何其他服务,则应该将其设置为作用域或临时的。

长短不一,除非您有充分明确的理由使其成为单例,否则请使用过渡范围。这就是上面提到的原因:维护状态,有效地利用有限的资源等。如果服务将在过渡范围内工作,并且没有充分的理由这样做,则使用过渡范围。

现在,ASP.NET Core的DI具有“瞬态”和“作用域”寿命。从它们来回的意义上讲,这两个都是“瞬态的”,但是每个“作用域”(通常是一个请求)实例化“ scoped”一次,而每次注入时总是实例化“ transient”。在此,除非有充分明确的理由使用“瞬态”,否则应使用“作用域”。

ASP.NET Core-在Singleton注入上存储库依赖项注入失败 - c#

我正在使用SoapCore为我的ASP.NET Core MVC应用程序创建Web服务。我正在使用Entity Framework Core和简单的存储库模式来获取我的数据库数据。我通过Startup.cs中的.AddSingleton()注入存储库类:services.AddSingleton<IImportRepository, ImportRep…

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

ASP.NET MVC Core 3.0 API将枚举序列化为字符串 - c#

如何在ASP.NET MVC Core 3.0中将Enum字段序列化为String而不是Int?我不能用旧的方式做。services.AddMvc().AddJsonOptions(opts => { opts.JsonSerializerOptions.Converters.Add(new StringEnumConverter()); }) 我收到…

Asp.net Core 2.1记录 - c#

我想了解登录asp.net cortex 2.1的问题。我的目标是注册所有可能导致kestrel服务器损坏的严重错误。据我从文档中了解Microsoft.Extensions.Logging和Serilog,您需要在每个控制器中创建一个记录器,并设置记录条件(例如try / catch)。是否有一种更方便的方法可以从一个地方记录项目中的任何严重错误?我将不胜…

在ASP.NET Core 2.1中添加自定义TagHelpers - c#

我严格按照ASP.NET Core文档进行操作,并花费了大量时间来拖曳堆栈溢出,试图实现简单的自定义TagHelper,但没有成功。任何人都可以就任何陷阱或已知错误提出建议吗?应用程序属性:AssemblyName: AmpWeb Target Framework .NET Core 2.1 NuGet软件包Microsoft.AspNetCore.All …