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