autoFac 生命周期 试验

2023-11-02 11:36
文章标签 生命周期 试验 autofac

本文主要是介绍autoFac 生命周期 试验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.概述 autoFac的生命周期

序号名称说明
1InstancePerDependency每次请求都创建一个新的对象
2InstancePerLifetimeScope同一个Lifetime生成的对象是同一个实例
3SingleInstance每次都用同一个对象

2.注 InstancePerLifetimeScope

同一个Lifetime生成的对象是同一个实例,这个理解起来有点不确定,什么叫“同一个Lifetime生成的对象”,就是生成过的几次,比如在一个程序中,只调用一次生成。

var builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>().InstancePerLifetimeScope();IContainer container = builder.Build();

只调用 一次,上面的注册,后面无论多少次获取,都是一个对象。

IA a = container.Resolve<IA>();

试验代码

 

class T2{static IContainer container;static T2(){var builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>().InstancePerLifetimeScope();container = builder.Build();}public void fun(){for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}}}

3.那么“同一个Lifetime生成的对象”指创建过一次,那么这个创建指的是“InstancePerLifetimeScope”还是“Build”

于是有了下面的试验,“InstancePerLifetimeScope”一次,但是每次获取对象前都“Build”

builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>().InstancePerLifetimeScope();
var container = builder.Build();

结果报了如下异常

 异常:

System.InvalidOperationException:“Build() or Update() can only be called once on a ContainerBuilder

 异常翻译:

System.InvalidOperationException: " Build()或Update()只能被ContainerBuilder调用一次

只能调用一次,那么“InstancePerLifetimeScope”和“Build”的调用次数只能是相同的,要么都同时一次,要么都同时多次。

完整代码

class T3{static ContainerBuilder builder;static T3(){builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>().InstancePerLifetimeScope();}public void fun(){var container = builder.Build();for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}}}

4.另外两种生命周期,都很好理解,"SingleInstance"相当于单件,“InstancePerDependency”相当于每次都创建。(如果没有描述生命周,默认也是这个:builder.RegisterType<A>().As<IA>())

InstancePerDependency(每次使用都是一个新的对象)

static void Main(string[] args){Console.WriteLine();var builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>().InstancePerDependency();IContainer container = builder.Build();for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}Console.ReadKey();}

 SingleInstance(多次获取使用的是一个对象)

static void Main(string[] args){Console.WriteLine();var builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>().SingleInstance();IContainer container = builder.Build();for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}Console.ReadKey();}

6.对比试验

生命周期对象中创建类中创建
InstancePerDependency每次获取的都是新对象每次获取的都是新对象
InstancePerLifetimeScope在创建对象的容器中是一个对象每次获取的都是新对象
SingleInstance在创建对象的容器中是一个对象每次获取的都是新对象

这里创建指:build

var builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>())container = builder.Build();

这里的使用指:resolve

IA a = container.Resolve<IA>();a.fun();

在对象中创建,指在构造函数中创建,每创建一个对象,就创建一次。

在类中创建,指在静态类中创建,无论多少个类,指创建一次。

代码

using Autofac;
using Autofac.Builder;
using System;
using System.Collections.Generic;namespace autoFac生命周期2
{class Program{static void Main(string[] args){Console.WriteLine();Program p = new Program();p.main();Console.ReadKey();}private void main(){foreach (EnumLeftFun enumLeftFun in Enum.GetValues(typeof(EnumLeftFun))){T.enumLeftFunMy = enumLeftFun;Console.WriteLine("\n------------"+enumLeftFun+"--------------------------------");test1();test2();}//test3();}private void test1(){Console.WriteLine("    test1 每个对象创建一次");T1 t1 = new T1();t1.fun();T1 t2 = new T1();t2.fun();}private void test2(){Console.WriteLine("    test2 每个类创建一次");T2 t21 = new T2();t21.fun();T2 t22 = new T2();t22.fun();}private void test3(){T3 t3 = new T3();t3.fun();T3 t31 = new T3();t31.fun();}class T2 : T{static IContainer container;static T2(){var builder = new ContainerBuilder();T.leftSelect(builder.RegisterType<A>().As<IA>());container = builder.Build();}public void fun(){for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}}}class T3{static ContainerBuilder builder;static T3(){builder = new ContainerBuilder();T.leftSelect(builder.RegisterType<A>().As<IA>());}public void fun(){var container = builder.Build();for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}}}class T1:T{IContainer container;public T1(){var builder = new ContainerBuilder();leftSelect(builder.RegisterType<A>().As<IA>());builder.RegisterType<A>().As<IA>().SingleInstance();container = builder.Build();}public void fun(){for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}}}delegate IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> delegateFun(IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> registrationBuilder);public enum EnumLeftFun{InstancePerDependency,InstancePerLifetimeScope,SingleInstance}class T{static Dictionary<EnumLeftFun, delegateFun> keyValuePairs = new Dictionary<EnumLeftFun, delegateFun>();public static EnumLeftFun enumLeftFunMy;static T(){keyValuePairs.Add(EnumLeftFun.InstancePerDependency, InstancePerDependency);keyValuePairs.Add(EnumLeftFun.InstancePerLifetimeScope, InstancePerLifetimeScope);keyValuePairs.Add(EnumLeftFun.SingleInstance, SingleInstance);}static public IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> leftSelect(IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> registrationBuilder){return keyValuePairs[enumLeftFunMy](registrationBuilder);}static protected IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> InstancePerDependency(IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> registrationBuilder){return registrationBuilder.InstancePerDependency();}static protected IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> InstancePerLifetimeScope(IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> registrationBuilder){return registrationBuilder.InstancePerLifetimeScope();}static protected IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> SingleInstance(IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> registrationBuilder){return registrationBuilder.SingleInstance();}}}interface IA{void fun();}class A : IA{static int index = 0;private int myIndex;public A(){this.myIndex = ++index;}public void fun(){Console.WriteLine("myIndex:" + myIndex);}}
}

运行结果

------------InstancePerDependency--------------------------------test1 每个对象创建一次
myIndex:1
myIndex:1
myIndex:1
myIndex:2
myIndex:2
myIndex:2test2 每个类创建一次
myIndex:3
myIndex:4
myIndex:5
myIndex:6
myIndex:7
myIndex:8------------InstancePerLifetimeScope--------------------------------test1 每个对象创建一次
myIndex:9
myIndex:9
myIndex:9
myIndex:10
myIndex:10
myIndex:10test2 每个类创建一次
myIndex:11
myIndex:12
myIndex:13
myIndex:14
myIndex:15
myIndex:16------------SingleInstance--------------------------------test1 每个对象创建一次
myIndex:17
myIndex:17
myIndex:17
myIndex:18
myIndex:18
myIndex:18test2 每个类创建一次
myIndex:19
myIndex:20
myIndex:21
myIndex:22
myIndex:23
myIndex:24

这篇关于autoFac 生命周期 试验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/330337

相关文章

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

【Vue】关于Vue3的生命周期

目录 Vue3中新增了一个setup生命周期函数:(1) setup执行的时机是在beforeCreate生命周期函数之前执行,在setup函数中是不能通过this来获取实例的;(2) 为了命名的统一性,将beforeDestroy 改名为 beforeUnmount,destroyed 改名为 unmounted 生命周期函数: setup —— 不能通过this来获

09 生命周期

生命周期 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestorydestoryed 辣子鸡:香辣入口,犹如吃了炫迈一样 - - - 根本停不下来 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport"

Maven生命周期:深入理解构建过程

目录 1. Maven生命周期简介 2. 默认生命周期的阶段 3. 清理生命周期 4. 站点生命周期 5. Maven生命周期的灵活性 6. 结论         在Java开发中,Maven是一个不可或缺的工具,它通过自动化项目的构建、依赖管理和文档生成等任务,极大地提高了开发效率。Maven的核心之一是其构建生命周期,它定义了项目构建过程中的一系列阶段。在这篇文章中,我们将深

【前端】animation动画以及利用vue制作简单的透明度改变动画,包含vue生命周期实现

一. 问题描述 想做一个文字透明度从1到0然后再从0到1的css动画。 二. 代码写法 2.1 animation写法 2.1.1 animation属性key 2.1.2 代码展示 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=de

【C++多线程编程】 线程安全与对象生命周期管理

目录 类的线程安全 实现线程安全  构造函数在多线程中的安全性 析构函数多线程环境的安全 智能指针实现多线程安全  shared_ptr 非完全线程安全 shared_ptr可能导致对象生命周期延长 const引用可以减少传递shared_ptr开销 shared_ptr 智能指针块模块的优点  析构所在线程问题分析  RAII的使用 enable_shared_from_

【ReactJS】通过一个例子学习React组件的生命周期

源代码 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Reac

1.1 Avtivity的生命周期全面分析

本文将Activity的生命周期分为两部分内容,一部分是典型情况下的生命周期,另一部分是异常情况下的生命周期。所谓典型情况下的生命周期,是指在有用户参与的情况下,Activity所经过的生命周期的改变;而异常情况下的生命周期是指在Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建,异常情况下的生命周期的关注点和典型情况下略有不同。 1

LeakCanary测试app内存泄露+registerActivityLifecycleCallbacks管理Activity的生命周期

public class MyApplication extends Application {private String tag = "MyApplication";private static Stack<Activity> activityStack;//检测内存泄露private RefWatcher refWatcher;@Overridepublic void onCreate()

SpringMVC request生命周期

第一步:用户发起一个请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HanderMapping查找Handler,可以根据xml配置文件,注解进行查找。 第三步:处理器映射器HandlerMapping向前端控制器返回Handler 第四步:前端控制器调用处理器适配器去执行Handler 第五步:处理器适配器去执行Handler 第六步:Handler执行完