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

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

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

验证方法实现逻辑:在类的构造函数中,给属性赋值(GUID),通过判断属性值是否一致来判断 三种生命周期的效果。

先上图看结果:

1、InstancePerLifetimeScope

2、SingleInstance

3、InstancePerDependency

整块代码实现如下:

using Autofac;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks; namespace SimpleAutofacConsole
{
class Program
{
static void Main(string[] args)
{
//IAnimal animal = new Tiger();
//animal.Show("普通new()对象"); var builder = new ContainerBuilder();
var dependencyRegistrar = new DependencyRegistrar();//(IDependencyRegistrar)Activator.CreateInstance(typeof(IDependencyRegistrar));
dependencyRegistrar.Register(builder, null); var container = builder.Build(); var animalIOC = container.Resolve<IAnimal>();
//animalIOC.Show("Autofac方式实现new()对象");
Console.WriteLine(animalIOC.Id); var animalIOC2 = container.Resolve<IAnimal>();
//animalIOC2.Show("第二次从容器中实例化");
Console.WriteLine(animalIOC2.Id); Console.WriteLine("开启新的生命周期");
ILifetimeScope inner = container.BeginLifetimeScope();
var myClass3 = inner.Resolve<IAnimal>();
Console.WriteLine(myClass3.Id);
var myClass4 = inner.Resolve<IAnimal>();
Console.WriteLine(myClass4.Id); //var animalIOC = container.Resolve<Dog>();
//animalIOC.Show("Autofac方式实现new()对象"); Console.ReadLine();
}
}
public interface IAnimal
{
void Show(string name);
string Id { get; set; }
}
public class Tiger : IAnimal
{
private string _Id;
public string Id { get { return this._Id; } set { Id = this._Id; } }
public Tiger()
{
_Id = Guid.NewGuid().ToString();
} public void Show(string name)
{
Console.WriteLine("老虎说:" + name);
}
}
public class Dog : IAnimal
{
public string Id { get { return Guid.NewGuid().ToString(); } set { } } public void Show(string name)
{
Console.WriteLine("狗狗说:" + name);
}
}
public class DependencyRegistrar : IDependencyRegistrar
{
public int Order { get { return 0; } } public void Register(ContainerBuilder builder, ITypeFinder typeFinder)
{
// InstancePerLifetimeScope 同一个Lifetime生成的对象是同一个实例
// SingleInstance 单例模式,每次调用,都会使用同一个实例化的对象;每次都用同一个对象
// InstancePerDependency 默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象
builder.RegisterType<Tiger>().As<IAnimal>().InstancePerLifetimeScope();
//builder.RegisterType<Dog>().As<IAnimal>();//.PreserveExistingDefaults();
}
} public interface IDependencyRegistrar
{
void Register(ContainerBuilder builder,ITypeFinder typeFinder); int Order { get; }
} public interface ITypeFinder
{
IList<Assembly> GetAssemblies(); IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, bool onlyConcreteClasses = true); IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true); IEnumerable<Type> FindClassesOfType<T>(bool onlyConcreteClasses = true); IEnumerable<Type> FindClassesOfType<T>(IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true);
}
}

  

Autofac学习之三种生命周期:InstancePerLifetimeScope、SingleInstance、InstancePerDependency 【转载】的更多相关文章

  1. Autofac学习之三种生命周期:InstancePerLifetimeScope、SingleInstance、InstancePerDependency

    InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例 SingleInstance:单例模式,每次调用,都会使用同一个实例化的对象:每次都用同一个对象: In ...

  2. DataSnap 2009 系列之三 (生命周期篇)

    DataSnap 2009 系列之三 (生命周期篇) DataSnap 2009的服务器对象的生命周期依赖于DSServerClass组件的设置 当DSServer启动时从DSServerClass组 ...

  3. Vue – 基础学习(1):对生命周期和钩子函的理解

    一.简介 先贴一下官网对生命周期/钩子函数的说明(先贴为敬):所有的生命周期钩子自动绑定 this 上下文到实例中,因此你可以访问数据,对属性和方法进行运算.这意味着你不能使用箭头函数来定义一个生命周 ...

  4. JAVA CDI 学习(2) - Scope 生命周期

    在上一节中,我们已经知道了如何用@Inject实现基本注入,这一节研究Bean实例注入后的“生命周期”,web application中有几种基本的生命周期(不管哪种编程语言都类似) 1.Applic ...

  5. Autofac容器对象实例的几种生命周期类型

    实例范围决定了如何在同一服务的请求之间共享实例. 请注意,您应该熟悉生命周期范围的概念,以便更好地理解此处发生的情况. 当请求服务时,Autofac可以返回单个实例(单实例作用域),新实例(每个依赖作 ...

  6. IoC之AutoFac(三)——生命周期

    阅读目录 一.Autofac中的生命周期相关概念 二.创建一个新的生命周期范围 三.实例周期范围 3.1   每个依赖一个实例(InstancePerDependency) 3.2  单个实例(Sin ...

  7. [翻译] Autofac 控制范围和生命周期

    原文链接:http://docs.autofac.org/en/latest/lifetime/index.html Lifetime 是指服务的实例在程序中存活多久 – 从最初的实例化到清理(dis ...

  8. android学习笔记 activity生命周期&任务栈&activity启动模式

    activity生命周期 完整生命周期 oncreate->onstart->onresume->onpause->onstop->ondestory 使用场景:应用程序 ...

  9. iOS学习笔记—ViewController/生命周期

    ViewController是iOS应用程序中重要的部分,是应用程序数据和视图之间的重要桥梁,ViewController管理应用中的众多视图.iOS的SDK中提供很多原生ViewController ...

随机推荐

  1. AssetBundle打包详解

    Unity5.x AssetBundle打包详解 在网上查看了很多资料,想详细搞清楚AssetBundle的原理.以实现符合项目需求的打包工具和加载逻辑 1. AssetBundle是什么? Asse ...

  2. 20165214 实验一 Java开发环境的熟悉

    20165214 实验一 Java开发环境的熟悉 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:朱文远 学号:20165214 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验 ...

  3. day 27 多态 接口 类方法 静态方法 hashlib 摘要算法模块

    # 多态的理解:# Python 天生自带多态# 鸭子类型 list 和 tuple 就是一对鸭子类型 很像但是没有继承关系## 而其他的类型 上传参数或者打印参数的时候 必须是指定的数据类型# -- ...

  4. jetty域证书更新

    服务器:centos6.6 1.从正确的.pfx文件中导出.pem认证文件 #openssl pkcs12 -in example.pfx -nodes -out server.pem pfx文件可以 ...

  5. jetty安装、配置、优化

    )Jetty: 作用:Jetty 是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境. 特性:易用性,可扩展性,易嵌入性 2) Jetty安装:  t ...

  6. 解释生成器(generator)于函数的不同,并实现和使用简单generator?

    生成器和函数的主要区别在于函数return avalue,生成器yield  a  value,同事标记或记忆point of the yield 以便在下次调用时从标记点恢复执行,yield使用函数 ...

  7. Day11作业及默写

    1.写函数,传入n个数,返回字典{'max':最大值,'min':最小值} 例如:min_max(2,5,7,8,4) 返回:{'max':8,'min':2}(此题用到max(),min()内置函数 ...

  8. 指定某个div随着指定大div滚动,而不是随着整个窗口固定不动

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. ES6 声明变量的6种方法

    ES5 只有两种声明变量的方法:var命令和function命令. ES6除了添加let和const命令,后面章节还会提到,另外两种声明变量的方法:import命令和class命令.所以,ES6 一共 ...

  10. 面向对象ZJ

    面向对象: 对象: 万事万物皆为对象. 特征, 动作或功能放在一起的就是一个对象 对象如何创建的. 在python中对象是通过类来创建的. 类是对对象的描述.统称.约束. class Car: def ...