<PackageReference Include="Castle.Windsor" Version="6.0.0" />

LifecycleModelInspector

Inspects the type looking for interfaces that constitutes lifecycle interfaces, defined in the Castle.Model namespace.
using Castle.Core; using Castle.Core.Internal; using Castle.MicroKernel.LifecycleConcerns; using System; using System.ComponentModel; using System.Linq; namespace Castle.MicroKernel.ModelBuilder.Inspectors { [Serializable] public class LifecycleModelInspector : IContributeComponentModelConstruction { public virtual void ProcessModel(IKernel kernel, ComponentModel model) { if (model == null) throw new ArgumentNullException("model"); if (IsLateBoundComponent(model)) ProcessLateBoundModel(model); else ProcessModel(model); } private bool IsLateBoundComponent(ComponentModel model) { return typeof(LateBoundComponent) == model.Implementation; } private void ProcessLateBoundModel(ComponentModel model) { LateBoundCommissionConcerns lateBoundCommissionConcerns = new LateBoundCommissionConcerns(); if (model.Services.Any((Type s) => s.Is<IInitializable>())) model.Lifecycle.Add(InitializationConcern.Instance); else lateBoundCommissionConcerns.AddConcern<IInitializable>(InitializationConcern.Instance); if (model.Services.Any((Type s) => s.Is<ISupportInitialize>())) model.Lifecycle.Add(SupportInitializeConcern.Instance); else lateBoundCommissionConcerns.AddConcern<ISupportInitialize>(SupportInitializeConcern.Instance); if (lateBoundCommissionConcerns.HasConcerns) model.Lifecycle.Add(lateBoundCommissionConcerns); if (model.Services.Any((Type s) => s.Is<IDisposable>())) model.Lifecycle.Add(DisposalConcern.Instance); else { LateBoundDecommissionConcerns lateBoundDecommissionConcerns = new LateBoundDecommissionConcerns(); lateBoundDecommissionConcerns.AddConcern<IDisposable>(DisposalConcern.Instance); model.Lifecycle.Add(lateBoundDecommissionConcerns); } } private void ProcessModel(ComponentModel model) { if (model.Implementation.Is<IInitializable>()) model.Lifecycle.Add(InitializationConcern.Instance); if (model.Implementation.Is<ISupportInitialize>()) model.Lifecycle.Add(SupportInitializeConcern.Instance); if (model.Implementation.Is<IDisposable>()) model.Lifecycle.Add(DisposalConcern.Instance); } } }