建立网站需要多少钱萍畜湖南岚鸿首选,公司网站条形码如何做,wordpress门户主题 门户一号下载,中卫网站设计公司招聘1.概述 autoFac的生命周期
序号名称说明1InstancePerDependency每次请求都创建一个新的对象2InstancePerLifetimeScope同一个Lifetime生成的对象是同一个实例3SingleInstance每次都用同一个对象
2.注 InstancePerLifetimeScope
同一个Lifetime生成的对象是同一个实例#x…1.概述 autoFac的生命周期
序号名称说明1InstancePerDependency每次请求都创建一个新的对象2InstancePerLifetimeScope同一个Lifetime生成的对象是同一个实例3SingleInstance每次都用同一个对象
2.注 InstancePerLifetimeScope
同一个Lifetime生成的对象是同一个实例这个理解起来有点不确定什么叫“同一个Lifetime生成的对象”就是生成过的几次比如在一个程序中只调用一次生成。
var builder new ContainerBuilder();builder.RegisterTypeA().AsIA().InstancePerLifetimeScope();IContainer container builder.Build();
只调用 一次上面的注册后面无论多少次获取都是一个对象。
IA a container.ResolveIA();
试验代码 class T2{static IContainer container;static T2(){var builder new ContainerBuilder();builder.RegisterTypeA().AsIA().InstancePerLifetimeScope();container builder.Build();}public void fun(){for (int i 0; i 3; i){IA a container.ResolveIA();a.fun();}}}
3.那么“同一个Lifetime生成的对象”指创建过一次那么这个创建指的是“InstancePerLifetimeScope”还是“Build”
于是有了下面的试验“InstancePerLifetimeScope”一次但是每次获取对象前都“Build”
builder new ContainerBuilder();builder.RegisterTypeA().AsIA().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.RegisterTypeA().AsIA().InstancePerLifetimeScope();}public void fun(){var container builder.Build();for (int i 0; i 3; i){IA a container.ResolveIA();a.fun();}}}
4.另外两种生命周期都很好理解SingleInstance相当于单件“InstancePerDependency”相当于每次都创建。如果没有描述生命周默认也是这个builder.RegisterTypeA().AsIA()
InstancePerDependency(每次使用都是一个新的对象)
static void Main(string[] args){Console.WriteLine();var builder new ContainerBuilder();builder.RegisterTypeA().AsIA().InstancePerDependency();IContainer container builder.Build();for (int i 0; i 3; i){IA a container.ResolveIA();a.fun();}Console.ReadKey();} SingleInstance多次获取使用的是一个对象
static void Main(string[] args){Console.WriteLine();var builder new ContainerBuilder();builder.RegisterTypeA().AsIA().SingleInstance();IContainer container builder.Build();for (int i 0; i 3; i){IA a container.ResolveIA();a.fun();}Console.ReadKey();}
6.对比试验
生命周期对象中创建类中创建InstancePerDependency每次获取的都是新对象每次获取的都是新对象InstancePerLifetimeScope在创建对象的容器中是一个对象每次获取的都是新对象SingleInstance在创建对象的容器中是一个对象每次获取的都是新对象
这里创建指build
var builder new ContainerBuilder();builder.RegisterTypeA().AsIA())container builder.Build();
这里的使用指resolve
IA a container.ResolveIA();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.RegisterTypeA().AsIA());container builder.Build();}public void fun(){for (int i 0; i 3; i){IA a container.ResolveIA();a.fun();}}}class T3{static ContainerBuilder builder;static T3(){builder new ContainerBuilder();T.leftSelect(builder.RegisterTypeA().AsIA());}public void fun(){var container builder.Build();for (int i 0; i 3; i){IA a container.ResolveIA();a.fun();}}}class T1:T{IContainer container;public T1(){var builder new ContainerBuilder();leftSelect(builder.RegisterTypeA().AsIA());builder.RegisterTypeA().AsIA().SingleInstance();container builder.Build();}public void fun(){for (int i 0; i 3; i){IA a container.ResolveIA();a.fun();}}}delegate IRegistrationBuilderIA, ConcreteReflectionActivatorData, SingleRegistrationStyle delegateFun(IRegistrationBuilderIA, ConcreteReflectionActivatorData, SingleRegistrationStyle registrationBuilder);public enum EnumLeftFun{InstancePerDependency,InstancePerLifetimeScope,SingleInstance}class T{static DictionaryEnumLeftFun, delegateFun keyValuePairs new DictionaryEnumLeftFun, delegateFun();public static EnumLeftFun enumLeftFunMy;static T(){keyValuePairs.Add(EnumLeftFun.InstancePerDependency, InstancePerDependency);keyValuePairs.Add(EnumLeftFun.InstancePerLifetimeScope, InstancePerLifetimeScope);keyValuePairs.Add(EnumLeftFun.SingleInstance, SingleInstance);}static public IRegistrationBuilderIA, ConcreteReflectionActivatorData, SingleRegistrationStyle leftSelect(IRegistrationBuilderIA, ConcreteReflectionActivatorData, SingleRegistrationStyle registrationBuilder){return keyValuePairs[enumLeftFunMy](registrationBuilder);}static protected IRegistrationBuilderIA, ConcreteReflectionActivatorData, SingleRegistrationStyle InstancePerDependency(IRegistrationBuilderIA, ConcreteReflectionActivatorData, SingleRegistrationStyle registrationBuilder){return registrationBuilder.InstancePerDependency();}static protected IRegistrationBuilderIA, ConcreteReflectionActivatorData, SingleRegistrationStyle InstancePerLifetimeScope(IRegistrationBuilderIA, ConcreteReflectionActivatorData, SingleRegistrationStyle registrationBuilder){return registrationBuilder.InstancePerLifetimeScope();}static protected IRegistrationBuilderIA, ConcreteReflectionActivatorData, SingleRegistrationStyle SingleInstance(IRegistrationBuilderIA, 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