dotnetcore/AspectCore-Framework

使用AspectCore.Extensions.Hosting以后单例生命周期错误

wapco opened this issue · 1 comments

wapco commented

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

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后单例的生命周期在多个线程的情况下会被实例化多次。

我看一下。