手机版

基于统一容器的对象生命周期管理分析

时间:2021-11-21 来源:互联网 编辑:宝哥软件园 浏览:

IoC容器的对象生存期管理如果您一直在使用IoC容器,您可能已经使用了一些对象生存期管理模型。通过管理对象的生存期,可以重用对象。它还使容器能够控制如何创建和管理对象实例。Unity提供的对象生存期管理模型是由抽象类LifetimeManager的派生类完成的。Unity将为每种类型的注册创建一个生存期管理器。每当UnityContainer需要创建一个新的对象实例时,它将首先检查对象类型的生存期管理器,以查看对象实例是否可用。如果没有可用的对象实例,UnityContainer将根据配置的信息构造对象实例,并将其移交给对象生存期管理器。LifetimeManagerLifetimeManager是一个实现ILifetimePolicy接口的抽象类。此类用作所有内置或自定义生存期管理器的父类。它定义了三种方法:GetValue-返回已经存储在生存期管理器中对象实例。setVaLue-在生存期管理器中存储一个新的对象实例。移除值-从生存期管理器中移除存储的对象实例。UnityContainer的默认实现不会调用此方法,但可以在自定义容器扩展中调用。Unity内置了六个生命周期管理模型,其中两个负责对象实例的创建和处置。transientlifetime manager-为每个请求生成一个新的类型对象实例。(默认行为)containercontroldlifiememmanager-实现一个Singleton对象实例。当容器被释放时,对象实例被释放。hierarchical lifetime manager-实现单例对象实例。但是,子容器不共享父容器实例,而是为word容器创建Singleton对象实例。当容器被释放时,对象实例被释放。external controlled ifetimemmanager-实现一个Singleton对象实例,但是容器只保存对对象的WeakReference,因此对象的生存期由外部引用控制。perthreadlifetime manager-为每个线程生成一个Singleton的对象实例,通过ThreadStatic实现。perresolvelifetime manager-实现类似TransientLifetimeManager的行为,并为每个请求生成一个新的类型对象实例。不同的是,对象实例可以在BuildUp过程中重用。代码重复代码如下:公共接口ieexample : idisposable { void say hello();}公共类示例: IExample { private bool _ disposed=false;私有只读Guid _key=Guid。NewGuid();public void sayHello(){ if(_ disposed){抛出新的objectdisposed exception(' Example '),字符串。格式(“{0}”已被释放!_ key));}控制台。write line(“{ 0 }在线程{1}中问好!”,_键,线程。CurrentThread . managed readid);} public void Dispose() { if(!_ disposed){ _ disposed=true;} } } } transientplifetime manager transientplifetime manager是Unity的默认生存期管理器。它的内部实现是空的,这意味着每次容器都会创建并返回一个新的对象实例,当然,容器不负责存储和销毁对象实例。复制代码如下: private static void testtransientplifetime manager(){ ieexample;使用(IUnityContainer容器=new UnityContainer()){ container。register type(type of(ieexample),typeof(Example),新的transientlifetime manager());//每个都有自己的实例容器。ResolveIExample()。sayHello();示例=容器。ResolveIExample();} //容器已被释放,但示例实例仍然存在//所有以前创建的实例都没有被释放!例子。sayHello();控制台。ReadKey();}

container controloldlifitmemmanager container controlledifiememmanager将为UnityContainer及其子容器提供一个一个的注册类型对象实例。其只在第一次请求某注册类型时创建一个新的对象实例,该对象实例将被存储到生存期管理器中,并且一直被重用。当容器析构时,生存期管理器会调用移除值将存储的对象销毁单身对象实例对应每个对象类型注册,如果同一对象类型注册多次,则将为每次注册创建单一的实例。复制代码代码如下:私有静态void testcontainercontroldlifiememanager(){ ie example;使用(国际集装箱容器=new unity container()){ container .寄存器类型(类型为(ieexample),类型为(example),新的容器控制器lifiememmanager());IUnityContainer first sub=null unitycontainer secondSub=null尝试{ firstSub=容器CreateChildContainer();secondSub=容器CreateChildContainer();//所有容器共享同一个实例//每个解析返回同一个实例第一艘潜艇.ResolveIExample().sayHello();//在另一个线程中运行一个解析,但仍然收到相同的实例Thread Thread=新线程(()=secondSub .ResolveIExample().sayHello());线start();集装箱ResolveIExample().sayHello();示例=容器ResolveIExample();线join();}最后{ if (firstSub!=null)第一个Sub .dispose();if (secondSub!=null) secondSub .dispose();} }尝试{ //异常-实例已通过容器示例释放sayHello();} catch(ObjectDepartedException ex){ Console .WriteLine(例如。消息);}控制台ReadKey();}

分层资产管理器类衍生自容器控制器质量管理器,其继承了父类的所有行为。与父类的不同之处在于子容器中的生存期管理器行为容器控制器质量管理器共享相同的对象实例,包括在子容器中。而分层资产管理器只在同一个容器内共享,每个子容器都有其单独的对象实例。复制代码代码如下:私有静态void testhierarchical lifiemanager(){ IEexample;使用(国际集装箱容器=new unity container()){ container .寄存器类型(类型为(ieexample),类型为(example),新的分层allifiememmanager());IUnityContainer first sub=null unitycontainer secondSub=null尝试{ firstSub=容器CreateChildContainer();secondSub=容器CreateChildContainer();//每个子容器都有自己的实例第一艘潜艇.ResolveIExample().sayHello();第二个.ResolveIExample().sayHello();集装箱ResolveIExample().sayHello();示例=firstSub .ResolveIExample();}最后{ if (firstSub!=null)第一个Sub .dispose();if (secondSub!=null) secondSub .dispose();} }尝试{ //异常-实例已通过容器示例释放sayHello();} catch(ObjectDepartedException ex){ Console .WriteLine(例如。消息);}控制台ReadKey();}

外部控制的时间管理器中的对象实例的生存期限将有UnityContainer外部的实现控制。此生存期管理器内部直存储了所提供对象实例的一个WeakReference。所以如果UnityContainer容器外部实现中没有对该对象实例的强引用,则该对象实例将被乔治勋章回收。再次请求该对象类型实例时,将会创建新的对象实例。复制代码代码如下:私有静态void testexternaly controlled ifetimemmanager(){ ie example;使用(国际集装箱容器=new unity container()){ container .寄存器类型(类型为(ieexample),类型为(example),新的externaly controlled ifetimemmanager());//以下容器中使用了相同的实例ResolveIExample().sayHello();集装箱ResolveIExample().sayHello();//运行垃圾收集器。存储示例实例将被释放//,因为它没有引用,并且LifetimeManager只保存WeakReference GC .collect();WeakReference目标存储的对象被释放//新实例被创建!集装箱ResolveIExample().sayHello();示例=容器ResolveIExample();}示例sayHello();控制台ReadKey();}这个结果证明强引用还存在,不知道为什么?如果你找到了原因,烦请告诉我,谢谢

perthreadlifetime managerperthreadlifetime manager模型提供"每线程单实例"功能。所有的对象实例在内部被存储在ThreadStatic的集合。容器并不跟踪对象实例的创建并且也不负责双糖。复制代码代码如下:私有静态void testperthreadlifetime manager(){ IEexample;使用(国际集装箱容器=new unity container()){ container .RegisterType(typeof(IExample),typeof(Example),新的perthreadlifetime manager());action int action=delegate(int sleep){//两个调用在每个线程容器中都使用相同的实例ResolveIExample().sayHello();线程。睡眠(睡眠);集装箱ResolveIExample().sayHello();};线程1=新线程((a)=操作。调用((int)a));线程2=新线程((a)=操作。调用((int)a));线程1。开始(50);线程2。开始(50);线程1。join();线程2。join();示例=容器ResolveIExample();}示例sayHello();控制台ReadKey();}

perresolvelifetime managerpreresolverlifetime manager是一致内置的一个特殊的模型。因为一致使用单独的逻辑来处理注册类型的每次解析生命期。每次请求分解一个类型对象时,UnityContainer都会创建并返回一个新的对象实例。复制代码代码如下:私有静态void testperrelevelifetime manager(){ IEexample;使用(国际集装箱容器=new unity container()){ container .寄存器类型(类型为(ieexample),类型为(example),新的perresolvelifetime manager());集装箱ResolveIExample().sayHello();集装箱ResolveIExample().sayHello();示例=容器ResolveIExample();}示例sayHello();控制台ReadKey();}

版权声明:基于统一容器的对象生命周期管理分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。