dotnetcore / AspectCore-Framework

AspectCore is an AOP-based cross platform framework for .NET Standard.
MIT License
1.69k stars 324 forks source link

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

Open wapco opened 3 years ago

wapco commented 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

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

liuhaoyang commented 3 years ago

我看一下。