• Autofac


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

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

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

    准备工作:

    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作用域,服务对于每次请求都会返回新的实例. 

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

    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();

    
    

      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等。  

    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和WCF集成中,每一次web请求或者方法调用,InstancePerLifetimeScope会被默认附加到component上。

       4、上下文

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

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

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

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

      var userSessionLifetime = container.BeginLifetimeScope();
      userSessionLifetime.Tag = MyContextHierarchy.UserSession;

     参考:

      AutoFac文档

  • 相关阅读:
    UVA 110 Meta-Loopless Sorts(输出挺麻烦的。。。)
    使用bash判断PATH中是否存在某个路径
    Palindrome(poj3974)(manacher算法)
    Highcharts简介
    android 4.3源码编译
    Unsupervised Feature Learning and Deep Learning(UFLDL) Exercise 总结
    借助Ant工具,实现快速开发
    关于tableView的简单实例
    Matlab单元(Cell)数据的应用
    spring 资源加载使用说明
  • 原文地址:https://www.cnblogs.com/elvinle/p/6233746.html
Copyright © 2020-2023  润新知