前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(7/30)Blazor系列:生命周期(Lifetime)

(7/30)Blazor系列:生命周期(Lifetime)

作者头像
沙漠尽头的狼
发布2021-12-15 16:17:00
1.3K0
发布2021-12-15 16:17:00
举报
文章被收录于专栏:Dotnet9

前面说过自己建立的Service都必须在Program.cs注册,但有些基本Service就不用自己做了。

目前Blazor提供内建的Service有三个,分别为:

  1. HttpClient:处理http请求,生命周期为Scoped(注意:只有Blazor WebAssembly有提供,Blazor Server必须自己注册)
  2. IJSRuntime:提供Javascript runtime组件处理JS功能,Blazor WebAssembly生命周期为Singleton,Blazor Server生命周期为Scoped
  3. NavigationManager:处理路由导向和状态,Blazor WebAssembly生命周期为Singleton,Blazor Server生命周期为Scoped

生命周期指的就是Component存活的时间,除了SingletonScoped,还有一种Transient

  1. Singleton是指从程序启动到结束都只会有一个实例,所有Component共用一个实例。
  2. Transient则是每次使用该Component时,都会产生一个新实例。
  3. Scoped较为特别,Blazor Server跟Blazor WebAssembly模式不相同,Blazor Server的Scoped是指每次HTTP请求都会产生一个新的实例,但Component之间通过SingalR传递不会产生,微软文档说明「Blazor WebAssembly目前没有DI的概念,Scoped相当于Singleton」。

不过笔者当初看了上述说明也是很蒙,直到看了一个视频用GUID示范后才有所明白,我们就来试试看。

首先建立一个接口IGuidService,里面只有一个类型为string的属性UId,接着建立类GuidService并在构造函数中初始化属性UId为GUID字符串,再去Program.cs使用AddTransient注册。

然后建立一个Guid.razorComponent,里面只有三行分别定义路由、注入服务以及显示GUID字符串,因为这案例很简单所以没用到ComponentBase,所以需要在_Import.razor加入@using BlazorServer.Services,最后为了切换方便,在NavMenu.razor定义一组NavLink指向刚才建立的Guid.razor

启动后不论在Post及Guid页面切换,或是重新加载页面,都可以看到生成全新的一组GUID,这就是Transient的特性:每次切换都产生新的实例。

接着将注册方式改为Singleton,可以看到就算重新加载网页,也都是同一组GUID,这就是Singleton的特性:程序启动到结束都只会有一个实例。

最后将注册方式改为Scoped,切换到Post页面再切回来,还是同一组GUID,但重新加载页面时就会产生新的一组,这就是Scoped的特性:每次产生HTTP请求都会有新的实例,Component之间则不会产生新实例。

上述的例子是以Blazor Server进行,若以Blazor WebAssembly进行,则Singleton会产生跟Blazor Server不同的情况,原因就是Blazor WebAssembly没有服务端,每次重新加载网页都会将程序下载到浏览器,这是一个全新的HTTP请求,所以SingletonScoped都是只要一重新加载网页就会产生新的实例。

注:笔者为了方便省略视频中某些内容,有兴趣的人可以再研究

引用:

  • Blazor Course-Use ASP.NET Core to Build Full-Stack C# Web Apps
  • ASP.NET Core Blazor dependency injection
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Dotnet9 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档