Lifecycle

概括

创建 --- 使用 --- 销毁

Lifecycle  Pipeline 是可扩展的,通过ILifecycleConcern 接口扩展自己的Lifecycle concern 添加到 Lifecycle Pipeline

Create --- commission concerns

在创建时执行的一些逻辑称为 commission concern

实现ICommissionConcern 接口,他会在组件实例化,并且依赖项注入后执行

OnCreate方法

在注册组件时使用OnCreate方法

container.Register(
Component.For<IService>()
.ImplementedBy<MyService>()
.OnCreate((kernel, instance) => instance.Timestamp = DateTime.UtcNow)
);

 

IInitializable接口

组件可实现Castle.Core.IInitializable接口,在组件创建时会调用它的唯一的方法Initialize

ISupportInitialize接口

如果不想引入Castle的引用,可使用System.ComponentModel.ISupportInitialize接口,他有两个方法BeginInit、EndInit会在创建时调用 

Destruction - Decommission concerns

在销毁时执行的逻辑 称为Decommision concern ,Decommission concerns 都实现IDecommissionConcern 接口 ,当组件从容器释放时执行时执行,包括几种情况container.ReleaseComponent 方法调用、容器销毁、生命期到期( its lifetime scope (for example web request) ends.)

OnDestroy 方法

container.Register(Component.For<MyClass>()
.LifestyleTransient()
.OnDestroy(myInstance => myInstance.ByeBye())
);

注意实现了IDispoable的Dispose方法先于Ondestroy方法

IDisposable 接口

当组件实现IDisaposable接口时,当它销毁时Windsor 会调用dispose方法

Windsor跟踪组件,(Windsor tracks components)为了支持销毁属性(Decommission property)Windsor会跟踪所有创建的组件的引用。

这也会带来内存使用问题,因为组件完成工作后可以被GC,但是此时容器还在引用组件所以会延迟回收,造成内存消耗问题。

Release Policy 可以决定不参加组件跟踪,但是不建议这样做。

自定义 Lifecycle Concerns

Lifecycle concerns 实现 Castle.Core.ICommissionConcern 或 Castle.Core.IDecommissionConcern 接口

Attaching the lifecycle concerns (附加生命周期关注点)

 attach your custom lifecycle concern to the ComponentModel of the component

model.Lifecycle.Add(new MyCommissionConcern());
model.Lifecycle.Add(new MyDecommissionConcern());

As attaching lifecycle concerns is operation modifying ComponentModel you should always do it in a ComponentModel construction contributor

posted @ 2019-08-05 01:36  vvf  阅读(492)  评论(0编辑  收藏  举报