首页 > 解决方案 > ASP.NET Core,AddScoped 不保留具有相同请求的数据

问题描述

使用 AddScoped 卡在一个项目中。

然后为了测试,我在 Asp.Net Core 中创建了一个新的 Web 应用程序项目,并创建了一个接口和一个 IMyInfo 和 MyInfo 类。它只有一个整数属性mydata和两个方法Increment() 和 GetData()。“Increment()”方法只是将值增加 1,“GetData()”方法返回属性“mydata”的值。通过一个TestingController,我只是在执行Increment() 方法,然后调用GetData()。

当我使用 AddSingleton 服务时,它会在每次重新加载请求时给出一个递增的值(即 1、2、3、4 ...),但每次使用 AddScoped(而不是 AddTransient)时都会得到“1”。

不知道我哪里错了?

以下是我的所有代码:

我在一个新项目中创建了以下接口和类:

public interface IMyInfo
{
    void Increment();
    int GetData();
}

public class MyInfo : IMyInfo
{
    private int mydata = 0;

    public void Increment()
    {
        mydata++;
    }
    public int GetData()
    {
        return mydata;
    }

}

然后创建了一个TestController:

public class TestController : Controller
{
    private readonly IMyInfo myInfo;

    public TestController(IMyInfo myInfo)
    {
        this.myInfo = myInfo;
    }

    public string Index()
    {
        myInfo.Increment();
        int d = myInfo.GetData();
        return d.ToString();
    }
}

这是我的启动文件代码:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();

        services.AddScoped<IMyInfo, MyInfo>();   // It is not giving me expected result...
        //services.AddSingleton<IMyInfo, MyInfo>();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Test}/{action=Index}/{id?}");
        });
    }
}

标签: asp.net-core

解决方案


是的,这是正常行为。

当服务被声明为Scoped时,它将在每个范围上都有一个新实例,默认情况下,ASP Core 在每个 HTTP 请求上创建一个新范围,但您可以自己创建一个范围(正如 @juunas 正确评论的那样)。

每次我们使用Transient时都会有一个新的实例。

正如@Yiyi You评论的那样,服务生命周期文档


推荐阅读