博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Autofac - 生命周期的理解
阅读量:5130 次
发布时间:2019-06-13

本文共 2437 字,大约阅读时间需要 8 分钟。

实例生命周期决定在同一个服务的每个请求的实例是如何共享的。

  当请求一个服务的时候,Autofac会返回一个单例 (single instance作用域), 一个新的对象 (per lifetime作用域) 或者在某种上下文环境中的单例。比如 一个线程 或者一个HTTP请求 (per lifetime 作用域)。

  这条规则适用于显式调用Resolve从容器中检索对象或者满足依赖而隐式实现的对象。

准备工作:

Copy
 
public class Person { public string Name { get; set; } public int Age { get; set; } public void Self() { Console.WriteLine("我叫{0}, 今年{1}岁了!", this.Name, this.Age); } }

开始了:

  1、Per Dependency

  在其他容器中也称作瞬态或者工厂,使用Per Dependency作用域,服务对于每次请求都会返回新的实例.

  在没有指定其他参数的情况下,这是默认是作用域。

Copy
var builder = new ContainerBuilder(); builder.Register(c => new Person() { Name = "Elvin" }).InstancePerDependency(); var container = builder.Build(); var person1 = container.Resolve
(); person1.Name = "person1"; var person2 = container.Resolve
(); person2.Name = "person2"; person1.Self(); person2.Self();

Copy
 
 

  2、Single Instance

  使用Single Instance作用域,所有对父容器或者嵌套容器的请求都会返回同一个实例。

  这里将 InstancePerDependency 直接替换成 SingleInstance 就行了, 其他代码是一样的. 直接看结果:

 

  3、Per Lifetime Scope

  每一个lifetime内, 生成的对象都是同一个实例.  

  这个作用域适用于嵌套的生命周期。一个使用Per Lifetime 作用域的component在一个 nested lifetime scope内最多有一个实例。

  当对象特定于一个工作单元时,这个非常有用。比如,一个HTTP请求,每一个工作单元都会创建一个nested lifetime,如果在每一次HTTP请求中创建一个nested lifetime,那么其他使用 per-lifetime 的component在每次HTTP请求中只会拥有一个实例。

  这种配置模型在其他容器中等价于per-HTTP-request, per-thread等。  

Copy
 
var builder = new ContainerBuilder(); builder.Register(c => new Person() { Name = "Elvin" }).InstancePerLifetimeScope(); var container = builder.Build(); var person1 = container.Resolve
(); person1.Name = "person1"; var person2 = container.Resolve
(); person2.Name = "person2"; var inner = container.BeginLifetimeScope(); var person3 = container.Resolve
(); person3.Name = "person3"; var person4= container.Resolve
(); person4.Name = "person4"; person1.Self(); person2.Self(); person3.Self(); person4.Self(); 

  

ASP.NET和WCF集成中,每一次web请求或者方法调用,InstancePerLifetimeScope会被默认附加到component上。

  4、上下文

  上下文作用域和per-lifetime作用域类似,但是对可见性提供更多显示的控制。

  在大多数程序中,同一层次的容器嵌套代表一个工作单元,如果需要多层嵌套(例如global->request->transation),可以使用标签确保component在多层结构中的某一层共享。

Copy
  builder.RegisterType
().InstancePerMatchingLifetimeScope(MyContextHierarchy.UserSession);

  提供的标签和生命周期作用域是对应的

Copy
 
  var userSessionLifetime = container.BeginLifetimeScope();   userSessionLifetime.Tag = MyContextHierarchy.UserSession; 转载 开源社区原文链接:

转载于:https://www.cnblogs.com/szwjb/p/7290258.html

你可能感兴趣的文章
postgreSQL 简单命令操作
查看>>
Spring JDBCTemplate
查看>>
Radon变换——MATLAB
查看>>
第五章笔记
查看>>
Iroha and a Grid AtCoder - 1974(思维水题)
查看>>
gzip
查看>>
转负二进制(个人模版)
查看>>
LintCode-Backpack
查看>>
查询数据库锁
查看>>
[LeetCode] Palindrome Number
查看>>
我对于脚本程序的理解——百度轻应用有感
查看>>
SQL更新某列包含XX的所有值
查看>>
网易味央第二座猪场落户江西 面积超过3300亩
查看>>
面试时被问到的问题
查看>>
spring 事务管理
查看>>
VS2008 去掉msvcr90的依赖
查看>>
当前记录已被另一个用户锁定
查看>>
Bootstrap
查看>>
Node.js 连接 MySQL
查看>>
ACM-ICPC 2018 world final A题 Catch the Plane
查看>>