- 三者基本概念
- 示例演示三者区别
- 什么时候该用谁
三者基本概念
这三个方法是asp.net core
提供的,用来将服务注册到依赖注入容器中。而不同的注册方法决定了注入对象的生命周期。从单词字面意思理解,瞬态、范围、单例。
AddSingleton: 创建一个单例服务,即在整个应用程序生命周期内只有这一个服务的实例。对于所有的http请求,都使用这一个实例。首次请求时创建该实例。
AddScoped: 在范围内的每个请求中创建一个新的Scoped服务实例。会对每个http请求进行创建一个实例,但在同一Web请求中的其他服务在调用这个请求,也会使用相同实例。对于同一个客户端请求中相同,不同客户端请求是不同的。
AddTransient: 每次请求都会创建新的实例。
接下来通过示例演示三者区别。创建一个asp.net core mvc
项目,通过不同注册方式来演示。
示例演示
创建项目
VS Code中新建目录,用于存放项目。在菜单中打开终端,输入以下命令创建mvc项目。
1 | dotnet new -au None -n coremvcdemo |
创建Model、Repository
创建Model目录,新建学生实体类。
1 | public class Student |
1 | public interface IStudentRepository |
1 | public class MockStudentRepositry:IStudentRepository |
准备Controller、Views
修改HomeController代码如下
点击查看 HomeController 代码
1 | public class HomeController : Controller |
Views目录下创建Index.cshtml、Details.cshtml、Create.cshtml
Index.cshtml代码如下,用来展示学生列表。
1 | @model List<Student> |
Create.cshtml代码如下,提供学生信息新增。
查看代码
1 | @model Student |
Program.cs中使用不同方式注册及运行结果
1 | using coremvcdemo; |
可以看到每一次提交,学生总数都在增加。同时,我们点击Home,回到首页,学生列表中也可以看到新增加的两个学生信息。说明MockStudentRepository没有重新实例化,否则学生列表就被初始为最初的三个了。
第一次点击创建按钮是,学生总人数增加到4了。但再次提交时,学生总数依然是4。
对于一次请求,到Home控制器,该控制器实例化studentRepository,对于同一个http请求,控制器和视图等多个地方需要用到服务,则在该http请求域中使用同一个服务实例。
无论点击几次创建按钮,学生总数一直是3。说明MockStudentRepository一直在被实例化,总是显示新实例化的对象中创建的三个学生信息。
什么时候该用谁
一般较常用AddScoped和AddSingleton。但在多线程时,需要注意,AddScoped无法在新线程里面共享主线程中创建的实例。因此,需要使用AddSingleton方式注入。
服务类型 | 同一个HTTP请求的范围 | 横跨多个不同 HTTP 请求 | 使用时参考意见 |
---|---|---|---|
Singleton Service | 同一个实例 | 同一个实例 | 每次创建都会占用更多内存资源,对性能产生负面影响。适用于状态很少或无状态的轻量级服务 |
Scoped Service | 同一个实例 | 新实例 | 需要维护请求中的状态时 |
Transient Service | 新实例 | 新实例 | 可以提高内存效率,但随着时间累积将造成内存泄漏 |
- 本文作者: 达文西
- 本文链接: https://edsiongithub.github.io/2021/12/14/24/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!