Autofac生命周期(4)

Autofac生命周期

  • 一、控制范围和生命周期
    • 1.Lifetime
    • 2.Scope
    • 3.lifetime scope
  • 二、Autofac学习之三种生命周期
    • 1.基础建设
    • 2. Per Dependency
    • 3.Single Instance
    • 4.Per Lifetime Scope

一、控制范围和生命周期

1.Lifetime

是指服务的实例在程序中存活多久 – 从最初的实例化到清理(disposal)。例如,一个实现 IDisposable 的对象,它的生命周期就是从实例化时开始,持续到调用它的 Dispose 时结束。(未主动调用 Disopose 则持续到被GC收集时)。

2.Scope

是指程序中的一块区域,在此区域内,服务可以被使用它的组件共享。例如,程序中全局的静态的单例对象,它的范围是整个程序。而在for循环里创建的本地变量,它的范围就要小的多。

3.lifetime scope

Autofac 中的生命周期范围(lifetime scope)组合了这两个概念。实际上,可以把生命周期范围与应用程序中的工作单元等同起来。在工作单元的开始时创建生命周期范围,工作单元需要的服务从这个生命周期范围解析获得。解析服务时,Autofac 会跟踪实现 IDisposable 接口的组件。在工作单元结束时,清理(Dispose)生命周期范围,实现 IDisposable 接口的组件会同时被清理

二、Autofac学习之三种生命周期

InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例


SingleInstance:单例模式,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;


InstancePerDependency:默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象;

1.基础建设

public class Person
{

    public string Name { get; set; }

    public int Age { get; set; }

    public void Self()
    {
        Console.WriteLine("我叫{0}, 今年{1}岁了!", this.Name, this.Age);
    }
}

2. Per Dependency

var builder = new ContainerBuilder();

builder.Register(c => new Person() { Name = "Elvin" }).InstancePerDependency();

var container = builder.Build();

var person1 = container.Resolve<Person>();
person1.Name = "person1";
            
var person2 = container.Resolve<Person>();
person2.Name = "person2";

person1.Self();
person2.Self();

在这里插入图片描述

3.Single Instance

这里将 InstancePerDependency 直接替换成 SingleInstance 就行了, 其他代码是一样的. 直接看结果:
在这里插入图片描述

4.Per Lifetime Scope

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

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

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

var builder = new ContainerBuilder();

builder.Register(c => new Person() { Name = "Elvin" }).InstancePerLifetimeScope();

var container = builder.Build();

var person1 = container.Resolve<Person>();
person1.Name = "person1";

var person2 = container.Resolve<Person>();
person2.Name = "person2";

var inner = container.BeginLifetimeScope();

var person3 = container.Resolve<Person>();
person3.Name = "person3";

var person4=  container.Resolve<Person>();
person4.Name = "person4";

person1.Self();
person2.Self();

person3.Self();
person4.Self(); 

在这里插入图片描述

你可能感兴趣的:(ASP.NET,Core,java,开发语言)