Open wapco opened 3 years ago
1、首先创建一个测试类 `public class TestService { private readonly ILogger _logger; private string test = Guid.NewGuid().ToString();
public TestService(ILogger<TestService> logger) { _logger = logger; //Thread.Sleep(1000); _logger.LogWarning("调用构造函数 - {0}", test); } public async Task SendCodeAnonymous() { _logger.LogWarning("调用方法 - {0}", test); } }`
2、注册为单例模式 services.AddSingleton();
3、在Program中加上UseServiceContext `using AspectCore.Extensions.Hosting; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting;
namespace WebApplication { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); }
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .UseServiceContext(); }
}`
4、通过5个线程同时调用api,日志输出如下,可以看出单例的构造函数被调用了5次 warn: WebApplication.TestService[0] 调用构造函数 - 0f193ff1-4d88-4cdc-983a-65bdbfe99284 warn: WebApplication.TestService[0] 调用构造函数 - be987d52-502a-4101-9ece-ef5e5a8ac935 warn: WebApplication.TestService[0] 调用构造函数 - e8deb6a9-2d1d-42ef-806a-5ced76c53271 warn: WebApplication.TestService[0] 调用构造函数 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用构造函数 - 1d43a20f-6228-4f10-8e92-80d944b18739 warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc
warn: WebApplication.TestService[0] 调用构造函数 - 0f193ff1-4d88-4cdc-983a-65bdbfe99284 warn: WebApplication.TestService[0] 调用构造函数 - be987d52-502a-4101-9ece-ef5e5a8ac935 warn: WebApplication.TestService[0] 调用构造函数 - e8deb6a9-2d1d-42ef-806a-5ced76c53271 warn: WebApplication.TestService[0] 调用构造函数 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用构造函数 - 1d43a20f-6228-4f10-8e92-80d944b18739 warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc
5、接着注释掉UseServiceContext(),重新用5个线程调用,输出日志如下: warn: WebApplication.TestService[0] 调用构造函数 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8
warn: WebApplication.TestService[0] 调用构造函数 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8
说明使用了UseServiceContext后单例的生命周期在多个线程的情况下会被实例化多次。
我看一下。
1、首先创建一个测试类 `public class TestService { private readonly ILogger _logger; private string test = Guid.NewGuid().ToString();
2、注册为单例模式 services.AddSingleton();
3、在Program中加上UseServiceContext `using AspectCore.Extensions.Hosting; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting;
namespace WebApplication { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); }
}`
4、通过5个线程同时调用api,日志输出如下,可以看出单例的构造函数被调用了5次
warn: WebApplication.TestService[0] 调用构造函数 - 0f193ff1-4d88-4cdc-983a-65bdbfe99284 warn: WebApplication.TestService[0] 调用构造函数 - be987d52-502a-4101-9ece-ef5e5a8ac935 warn: WebApplication.TestService[0] 调用构造函数 - e8deb6a9-2d1d-42ef-806a-5ced76c53271 warn: WebApplication.TestService[0] 调用构造函数 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用构造函数 - 1d43a20f-6228-4f10-8e92-80d944b18739 warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc warn: WebApplication.TestService[0] 调用方法 - 6d03d80d-fdfb-4082-aa7b-0dba6d3faabc
5、接着注释掉UseServiceContext(),重新用5个线程调用,输出日志如下:
warn: WebApplication.TestService[0] 调用构造函数 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8 warn: WebApplication.TestService[0] 调用方法 - b6d2edf7-ae3b-4a28-8f02-1cedfd956bc8
说明使用了UseServiceContext后单例的生命周期在多个线程的情况下会被实例化多次。