AutoFac生命周期

1.建立一个新的生命周期范围

您能够经过在任何现有生命周期做用域上从根容器开始调用BeginLifetimeScope()方法来建立生命周期做用域。生命周期做用域是可销毁的,他们跟踪组件的处置,因此确保你老是调用“Dispose()”或者把它们包装在“using”语句中。

 using(var scope = container.BeginLifetimeScope())
    {
      // 从做为根容器子项的做用域来解析服务
      var service = scope.Resolve<IService>();
  
      // 可以建立嵌套的做用域...
      using(var unitOfWorkScope = scope.BeginLifetimeScope())
      {
        var anotherService = unitOfWorkScope.Resolve<IOther>();
     }
   }

2.实例周期范围

2.1一个依赖一个实例(InstancePerDependency)

使用这个选项,每次请求服务都会返回一个新实例,这是默认选项

  var builder = new ContainerBuilder();
  builder.RegisterType<Worker>();
  builder.RegisterType<Worker>().InstancePerDependency();

2.2  单个实例(SingleInstance)

在整个进程中,对象永远都是同一个实例

var builder = new ContainerBuilder();
builder.RegisterType<Worker>().SingleInstance();

2.3每一个生命周期范围一个实例 (InstancePerLifetimeScope)

var builder = new ContainerBuilder();
builder.RegisterType<Worker>().InstancePerLifetimeScope();

2.4每一个匹配的生命周期范围一个实例(InstancePerMatchingLifetimeScope)

 var builder = new ContainerBuilder();
 builder.RegisterType<Worker>().InstancePerMatchingLifetimeScope("myscope");

2.5 每一个请求一个实例( InstancePerRequest)

var builder = new ContainerBuilder();
builder.RegisterType<Worker>().InstancePerRequest();

2.6每一个 Owned 一个实例 ( InstancePerOwned)

var builder = new ContainerBuilder();
builder.RegisterType<MessageHandler>();
builder.RegisterType<ServiceForHandler>().InstancePerOwned<MessageHandler>();

// 本例中 ServiceForHandler 服务会限制在 MessageHandler 实例范围内。
using(var scope = container.BeginLifetimeScope())
    {
      // MessageHandler 和附属的 ServiceForHandler 
      // 在 scope 下面的一个微型的 lifetime scope 中。
      // 解析 Owned<T> 须要程序员负责执行清理工做。
      var h1 = scope.Resolve<Owned<MessageHandler>>();
      h1.Dispose();
    }

2.7 线程范围经过

// InstancePerLifetimeScope,每一个线程创建本身的LifetimeScope
var builder = new ContainerBuilder();
builder.RegisterType<Service>().InstancePerLifetimeScope();

var container = builder.Build();

// 而后让每一个建立本身的 lifetime scope
void ThreadStart()
    {
      using (var threadLifetime = container.BeginLifetimeScope())
      {
        var thisThreadsInstance = threadLifetime.Resolve<MyThreadScopedComponent>(); 
    } 
  }

注:在多线程场景下,要当心不要将父范围清理掉。不然,派生线程中的子范围将没法解析服务。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值