ASP.NET Core Singleton 实例与 Transient 实例性能

编程代码

1个回答

写回答

onlypolaris

2025-07-09 04:55

+ 关注

etc
etc

ASP.NET Core是一个跨平台的开源框架,用于构建现代化的Web应用程序。在ASP.NET Core中,我们可以使用不同的生命周期来管理依赖注入的实例。两个常用的生命周期是Singleton和Transient。

在本文中,我们将探讨ASP.NET Core中Singleton实例和Transient实例之间的性能差异,并提供一些案例代码来说明它们的使用方式。

Singleton 实例

Singleton实例是在整个应用程序的生命周期中只创建一次,并且所有的请求都共享同一个实例。这意味着在整个应用程序中,只有一个实例被创建和维护。Singleton实例在需要共享数据或资源的情况下非常有用。

在ASP.NET Core中,我们可以通过在Startup类的ConfigureServices方法中使用如下代码来注册Singleton实例:

csharp

services.AddSingleton<IService, Service>();

在上面的代码中,IService是我们要注册的接口,而Service是实现该接口的具体类。

Transient 实例

相比之下,Transient实例在每个请求中都会创建一个新的实例。这意味着每个请求都会创建一个新的对象,并且每个对象都是相互独立的。Transient实例适用于不需要共享状态的情况。

在ASP.NET Core中,我们可以通过在Startup类的ConfigureServices方法中使用如下代码来注册Transient实例:

csharp

services.AddTransient<IService, Service>();

在上面的代码中,IService是我们要注册的接口,而Service是实现该接口的具体类。

性能比较

现在我们来比较一下Singleton实例和Transient实例之间的性能差异。为了进行比较,我们创建一个简单的应用程序,其中包含一个简单的接口和实现该接口的类。接下来,我们将对这两种实例进行性能测试。

首先,我们来测试Singleton实例的性能。我们将使用一百个并发请求来访问Singleton实例。代码如下所示:

csharp

public class SingletonController : Controller

{

private readonly IService _service;

public SingletonController(IService service)

{

_service = service;

}

public IActionResult Index()

{

// 使用 _service 对象执行一些操作

return View();

}

}

接下来,我们来测试Transient实例的性能。我们将使用一百个并发请求来访问Transient实例。代码如下所示:

csharp

public class TransientController : Controller

{

private readonly IService _service;

public TransientController(IService service)

{

_service = service;

}

public IActionResult Index()

{

// 使用 _service 对象执行一些操作

return View();

}

}

性能测试结果

经过性能测试,我们得出以下:

- 在低负载的情况下,Singleton实例的性能比Transient实例的性能要好。这是因为Singleton实例只创建一次,而Transient实例在每个请求都会创建一个新的实例,所以创建实例的开销比较大。

- 在高负载的情况下,Transient实例的性能比Singleton实例的性能要好。这是因为在高负载情况下,Singleton实例需要处理大量的并发请求,而Transient实例可以为每个请求创建一个新的实例,从而避免了并发访问的问题。

在ASP.NET Core中,我们可以根据应用程序的需求选择Singleton实例或Transient实例来管理依赖注入的实例。如果需要共享状态或资源,我们可以使用Singleton实例;如果不需要共享状态或资源,我们可以使用Transient实例。在选择生命周期时,我们还应该考虑应用程序的性能需求。

,ASP.NET Core的Singleton实例和Transient实例之间存在一些性能差异。通过合理选择生命周期,我们可以优化应用程序的性能,并提供更好的用户体验。

希望本文对您理解ASP.NET Core中Singleton实例和Transient实例的性能差异有所帮助。如有任何疑问,请随时向我们提问。谢谢!

参考代码:

csharp

using Microsoft.AspNetcore.Mvc;

using Microsoft.Extensions.DependencyInjection;

public interface IService

{

void DoSomething();

}

public class Service : IService

{

public void DoSomething()

{

// 执行一些操作

}

}

public class SingletonController : Controller

{

private readonly IService _service;

public SingletonController(IService service)

{

_service = service;

}

public IActionResult Index()

{

// 使用 _service 对象执行一些操作

return View();

}

}

public class TransientController : Controller

{

private readonly IService _service;

public TransientController(IService service)

{

_service = service;

}

public IActionResult Index()

{

// 使用 _service 对象执行一些操作

return View();

}

}

public class Startup

{

public void ConfigureServices(IServiceCollection services)

{

services.AddSingleton<IService, Service>();

// 或者使用以下代码注册 Transient 实例

// services.AddTransient<IService, Service>();

}

public void Configure(IApplicationBuilder app)

{

app.UseRouting();

app.UseEndpoints(endpoints =>

{

endpoints.MapControllerRoute(

name: "default",

pattern: "{controller=Home}/{action=Index}/{id?}");

});

}

}

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号