
ASP.NET Core 作用域与对象释放行为 (基础)[学习笔记]
知识大纲
作用域
- IServiceScope
实现IDisposable接口类型的释放
- DI只负责释放由其创建的对象实例
- DI在容器或子容器释放时,释放由其创建的对象实例
代码准备
项目结构
项目中相关代码
OrderService.cs
public interface IOrderService
{
}
public class DisposableOrderService : IOrderService, IDisposable
{
public void Dispose()
{
Console.WriteLine($"DisposableOrderService Disposed:{this.GetHashCode()}");
}
}
WeatherForecastController.cs
[HttpGet]
public int Get(
[FromServices]IOrderService orderService,
[FromServices]IOrderService orderService2,
[FromServices]IHostApplicationLifetime hostApplicationLifetime,
[FromQuery]bool stop = false
)
{
#region
Console.WriteLine("=======1=========="+ " orderService :"+ orderService.GetHashCode());
using (IServiceScope scope = HttpContext.RequestServices.CreateScope())
{
var service = scope.ServiceProvider.GetService<IOrderService>();
var service2 = scope.ServiceProvider.GetService<IOrderService>();
Console.WriteLine("=======2==========" + " service :" + service.GetHashCode());
Console.WriteLine("=======2==========" + " service2 :" + service2.GetHashCode());
}
Console.WriteLine("=======3==========" + " orderService2 :" + orderService2.GetHashCode());
#endregion
#region
if (stop)
{
hostApplicationLifetime.StopApplication();
}
#endregion
Console.WriteLine("接口请求处理结束");
return 1;
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IOrderService, DisposableOrderService>();
//services.AddSingleton<IOrderService>(p=>new DisposableOrderService());
//services.AddScoped<IOrderService, DisposableOrderService>();
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime hostApplicationLifetime)
{
//var s = app.ApplicationServices.GetService<IOrderService>();
//var s2 = app.ApplicationServices.GetService<IOrderService>();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Transient
services.AddTransient<IOrderService, DisposableOrderService>();
Singleton
services.AddSingleton<IOrderService>(p=>new DisposableOrderService());
Scoped
services.AddScoped<IOrderService, DisposableOrderService>();
从上述来看可以清晰的看到对象的释放情况,这里我们可以通过stop为true时再次去观察情况
hostApplicationLifetime.StopApplication(); |
关闭当前应用程序 |
项目地址
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
2
文章
633
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术