asp.net-core - 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?}");
});
}
}
解决方案
是的,这是正常行为。
当服务被声明为Scoped时,它将在每个范围上都有一个新实例,默认情况下,ASP Core 在每个 HTTP 请求上创建一个新范围,但您可以自己创建一个范围(正如 @juunas 正确评论的那样)。
每次我们使用Transient时都会有一个新的实例。
正如@Yiyi You评论的那样,服务生命周期文档。
推荐阅读
- deep-learning - 如何在训练和推理过程中有效地使用 Deespeech (v0.5.1) 和语言模型的使用?
- python-3.x - 在子进程中使用ghostscript将.ps文件转换为.png文件并保存最后一个时出现问题
- javascript - 我如何重构多个 if...else 以提高效率?
- r - 计算两个列表之间的皮尔逊相关性
- linear-programming - LPsolve IDE 找不到解决方案
- r - R中按日期和行求和
- python - Pandas 有条件地创建大量数据框列
- c++ - 如何用现有的基类指针构造一个类?
- android - 活动在 startActivity(intent) 之后没有启动
- python - Python 2.7 tkinter - 与 widget.tk_focusNext().focus() 相反