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);
}
}
}