autofac文档:实例生命周期

AutoFac文档

目录

  1. 开始
  2. Registering components
  3. 控制作用域和生命周期
  4. 用模块结构化Autofac
  5. xml配置
  6. 与.net集成
  7. 深入理解Autofac
  8. 指导
  9. 关于
  10. 词汇表

实例生命周期

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

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

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

更深入的探讨请参考an Autofac Lifetime Primer.

Per Dependency

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

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

 builder.RegisterType<X>();

// or

builder.RegisterType<X>().InstancePerDependency();
 

Single Instance

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

 builder.RegisterType<X>().SingleInstance();
 

Per Lifetime Scope

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

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

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

 builder.RegisterType<X>().InstancePerLifetimeScope();
 

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

上下文的

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

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

 builder.RegisterType<X>().InstancePerMatchingLifetimeScope(MyContextHierarchy.UserSession);
 

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

 var userSessionLifetime = container.BeginLifetimeScope();
userSessionLifetime.Tag = MyContextHierarchy.UserSession;
 
posted @ 2012-06-09 20:32 Iyy 阅读(...) 评论(...) 编辑 收藏