castle-windsorfacilities

Castle Windsor, hook continer release in order to call explicit components release


I run this at the application Start Up

public class ConfigurationFacility : AbstractFacility {
    private readonly List<string> configuredComponents = new List<string>();

    protected override void Init() {
        Kernel.ComponentRegistered += OnComponentRegistered;
        // add environment configurators
    }
    private void OnComponentRegistered(string key, IHandler handler) {
        // if the component is a configurator then run conf settings and add it to configuredComponents
    }}

Question: How to hook tear down and to call explicit release for each ?

Thanks


Solution

  • You can use either the ComponentDestroyed event of IKernel or just implement IDisposable in your components. Here's a little sample code:

    namespace WindsorInitConfig {
        [TestFixture]
        public class ConfigurationFacilityTests {
            [Test]
            public void tt() {
                OneDisposableComponent component = null;
                using (var container = new WindsorContainer()) {
                    container.AddFacility<ConfigurationFacility>();
                    container.AddComponent<OneDisposableComponent>();
                    component = container.Resolve<OneDisposableComponent>();
                }
                Assert.IsTrue(component.Disposed);
                Assert.Contains(component, ConfigurationFacility.DestroyedComponents);
            }
    
            public class OneDisposableComponent : IDisposable {
                public bool Disposed { get; private set; }
    
                public void Dispose() {
                    Disposed = true;
                }
            }
    
            public class ConfigurationFacility : AbstractFacility {
                private readonly List<string> configuredComponents = new List<string>();
                public static readonly ArrayList DestroyedComponents = new ArrayList();
    
                protected override void Init() {
                    Kernel.ComponentRegistered += OnComponentRegistered;
                    Kernel.ComponentDestroyed += Kernel_ComponentDestroyed;
                    // add environment configurators
                }
    
                private void Kernel_ComponentDestroyed(ComponentModel model, object instance) {
                    DestroyedComponents.Add(instance);
                    // uninitialization, cleanup
                }
    
                private void OnComponentRegistered(string key, IHandler handler) {
                    // if the component is a configurator then run conf settings and add it to configuredComponents
                    configuredComponents.Add(key);}
            }
        }
    }
    

    The static ArrayList is only for demo purposes, of course.