在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Transient:每一次GetService都会创建一个新的实例 Scoped:在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内) Singleton:整个应用程序生命周期内只创建一个实例
上面描述的比较抽象,不容易理解,用实例来讲解会比较直观。 下面通过具体的例子进行演示。 定义三个空的接口:IArticleService、IProductService、IUserService 然后定义三个实现:ArticleService、ProductService、UserService 1.将接口和实现注入到DI容器 在StartUp类的ConfigureServices方法添加下图代码 public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.Configure<Test>(Configuration.GetSection("Test")); //演示生命周期 services.AddTransient<IUserService, UserService>(); services.AddScoped<IArticleService, ArticleService>(); services.AddSingleton<IProductService, ProductService>(); } 2.添加私有字段,在测试Controller:LifeTimeController中添加下图代码 private readonly IUserService _userService1; private readonly IUserService _userService2; private readonly IArticleService _articleService1; private readonly IArticleService _articleService2; private readonly IProductService _productService1; private readonly IProductService _productService2; 3.添加构造方法 public LifeTimeController( IUserService userService1, IUserService userService2, IArticleService articleService1, IArticleService articleService2, IProductService productService1, IProductService productService2 ) { _userService1 = userService1; _userService2 = userService2; _articleService1 = articleService1; _articleService2 = articleService2; _productService1 = productService1; _productService2 = productService2; } 4.添加测试代码 public IActionResult Index() { var sb = new StringBuilder(); sb.Append("transient1:" + _userService1.GetHashCode() + "<br />"); sb.Append("transient2:" + _userService2.GetHashCode() + "<br />"); sb.Append("scope1:" + _articleService1.GetHashCode() + "<br />"); sb.Append("scope2:" + _articleService2.GetHashCode() + "<br />"); sb.Append("singleton1:" + _productService1.GetHashCode() + "<br />"); sb.Append("singleton2:" + _productService2.GetHashCode() + "<br />"); Response.ContentType = "text/html"; return Content(sb.ToString()); } 5.执行结果 第一次刷新: transient1:66454027 第二次刷新: transient1:103653 可见 transient类型的生命周期,每次使用都不一样,不同的类或不同的方法使用都不一样 scope类型的生命周期,在同一个请求内是一样的 singleton类型的生命周期,每次请求都是一样的
所以理解了生命周期的作用,我们在开发的时候就可以根据需要对不同的服务选择不同的生命周期了。 |
请发表评论