Author: hammett
Date: Wed Sep  1 07:45:44 2004
New Revision: 37340

Modified:
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/   (props changed)
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/BaseKernel.cs
   
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Factory/IComponentFactory.cs
   
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/AbstractHandler.cs
   
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandler.cs
   
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandlerFactory.cs
   
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/SimpleHandler.cs
   
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/SimpleHandlerFactory.cs
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/IHandler.cs
   
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/IHandlerFactory.cs
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/IKernel.cs
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/IKernelEvents.cs
   
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/AbstractHandlerTestCase.cs
   
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/Apache.Avalon.Castle.MicroKernel.Test.csproj
   
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/BaseKernelTestCase.cs
   
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/KernelEventsTestCase.cs
   avalon/trunk/central/laboratory/avalon-net/DynamicProxy/   (props changed)
   avalon/trunk/central/laboratory/avalon-net/Framework/AvalonFramework/   (props 
changed)
Log:
Event Infrastructure done. 

Modified: avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/BaseKernel.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/BaseKernel.cs 
(original)
+++ avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/BaseKernel.cs Wed 
Sep  1 07:45:44 2004
@@ -14,88 +14,119 @@
 

 namespace Apache.Avalon.Castle.MicroKernel

 {

-       using System;

-       using System.Collections;

+    using System;

+    using System.Collections;

     using System.ComponentModel;

 

-       using Apache.Avalon.Castle.MicroKernel.Model;

-       using Apache.Avalon.Castle.MicroKernel.Subsystems.Lookup.Default;

-

-       /// <summary>

-       /// Base implementation of <see cref="IKernel"/>

-       /// </summary>

-       public class BaseKernel : IKernel, IDisposable

-       {

+    using Apache.Avalon.Framework;

+    using Apache.Avalon.Castle.MicroKernel.Model;

+    using Apache.Avalon.Castle.MicroKernel.Handler.Default;

+    using Apache.Avalon.Castle.MicroKernel.Lifestyle.Default;

+    using Apache.Avalon.Castle.MicroKernel.Model.Default;

+    using Apache.Avalon.Castle.MicroKernel.Interceptor;

+    using Apache.Avalon.Castle.MicroKernel.Interceptor.Default;

+

+    /// <summary>

+    /// Base implementation of <see cref="IKernel"/>

+    /// </summary>

+    public class BaseKernel : IKernel, IDisposable

+    {

         private static readonly object ComponentRegisteredEvent = new object();

-        private static readonly object ComponentInterceptionEvent = new object();

-        private static readonly object ComponentCreatedEvent = new object();

-        private static readonly object ComponentDestroyedEvent = new object();

+        private static readonly object ComponentUnregisteredEvent = new object();

+        private static readonly object ComponentWrapEvent = new object();

+        private static readonly object ComponentUnWrapEvent = new object();

+        private static readonly object ComponentReadyEvent = new object();

+        private static readonly object ComponentReleasedEvent = new object();

+        private static readonly object ComponentModelConstructedEvent = new object();

 

         protected EventHandlerList m_events;

 

         protected IList m_componentsInstances = new ArrayList();

 

-        protected Hashtable m_components;

+        protected Hashtable m_key2Handler;

 

-               protected Hashtable m_services;

+        protected Hashtable m_service2Key;

 

-               protected Hashtable m_subsystems;

+        protected Hashtable m_subsystems;

 

-               protected Hashtable m_dependencyToSatisfy;

+        protected Hashtable m_dependencyToSatisfy;

 

-               protected IHandlerFactory m_handlerFactory;

+        protected IHandlerFactory m_handlerFactory;

 

-               protected IComponentModelBuilder m_componentModelBuilder;

+        protected IComponentModelBuilder m_componentModelBuilder;

 

-               protected ILifestyleManagerFactory m_lifestyleManagerFactory;

+        protected ILifestyleManagerFactory m_lifestyleManagerFactory;

 

-               /// <summary>

-               /// 

-               /// </summary>

-               public BaseKernel()

-               {

+        protected IInterceptedComponentBuilder m_interceptedComponentBuilder;

+

+        /// <summary>

+        /// 

+        /// </summary>

+        public BaseKernel()

+        {

             m_events = new EventHandlerList();

-            m_services = new Hashtable();

-                       m_components = new 
Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);

-                       m_subsystems = new Hashtable();

-                       m_handlerFactory = new Handler.Default.SimpleHandlerFactory();

-                       m_dependencyToSatisfy = new Hashtable();

-                       m_componentModelBuilder = new 
Model.Default.DefaultComponentModelBuilder( this );

-                       m_lifestyleManagerFactory = new 
Lifestyle.Default.SimpleLifestyleManagerFactory();

-

-                       InitializeSubsystems();

-               }

-

-               #region IKernel Members

-

-               /// <summary>

-               /// Adds a component to kernel.

-               /// </summary>

-               /// <param name="key">The unique key that identifies the 
component</param>

-               /// <param name="service">The service exposed by this component</param>

-               /// <param name="implementation">The actual implementation</param>

-               public void AddComponent( String key, Type service, Type 
implementation )

-               {

-                       AssertUtil.ArgumentNotNull( key, "key" );

-                       AssertUtil.ArgumentNotNull( service, "service" );

-                       AssertUtil.ArgumentNotNull( implementation, "implementation" );

-                       AssertUtil.ArgumentMustBeInterface( service, "service" );

-                       AssertUtil.ArgumentMustNotBeInterface( implementation, 
"implementation" );

-                       AssertUtil.ArgumentMustNotBeAbstract( implementation, 
"implementation" );

-                       

+            m_key2Handler = new Hashtable(CaseInsensitiveHashCodeProvider.Default, 
CaseInsensitiveComparer.Default);

+            m_service2Key = new Hashtable();

+            m_subsystems = new Hashtable();

+            m_handlerFactory = new SimpleHandlerFactory();

+            m_dependencyToSatisfy = new Hashtable();

+            m_componentModelBuilder = new DefaultComponentModelBuilder(this);

+            m_lifestyleManagerFactory = new SimpleLifestyleManagerFactory();

+            m_interceptedComponentBuilder = new DefaultInterceptedComponentBuilder();

+

+            InitializeSubsystems();

+        }

+

+        #region IKernel Members

+

+        /// <summary>

+        /// Adds a component to kernel.

+        /// </summary>

+        /// <param name="key">The unique key that identifies the component</param>

+        /// <param name="service">The service exposed by this component</param>

+        /// <param name="implementation">The actual implementation</param>

+        public void AddComponent(String key, Type service, Type implementation)

+        {

+            AssertUtil.ArgumentNotNull(key, "key");

+            AssertUtil.ArgumentNotNull(service, "service");

+            AssertUtil.ArgumentNotNull(implementation, "implementation");

+            AssertUtil.ArgumentMustBeInterface(service, "service");

+            AssertUtil.ArgumentMustNotBeInterface(implementation, "implementation");

+            AssertUtil.ArgumentMustNotBeAbstract(implementation, "implementation");

+

             if (!service.IsAssignableFrom(implementation))

             {

-                               throw new ArgumentException("The specified 
implementation does not implement the service interface");

-                       }

+                throw new ArgumentException("The specified implementation does not 
implement the service interface");

+            }

 

-                       IComponentModel model = ModelBuilder.BuildModel( key, service, 
implementation );

+            IComponentModel model = ModelBuilder.BuildModel(key, service, 
implementation);

+            OnModelConstructed( model, key );

 

-                       IHandler handler = HandlerFactory.CreateHandler( model );

-                       handler.Init ( this );

+            IHandler handler = HandlerFactory.CreateHandler(model);

+            handler.Init(this);

 

-                       m_components[ key ] = handler;

+            m_key2Handler[ key ] = handler;

+            OnComponentRegistered(model, key, handler);

+        }

 

-            OnNewHandler( model, key, service, implementation, handler);

+        /// <summary>

+        /// Pending.

+        /// </summary>

+        /// <param name="key"></param>

+        public void RemoveComponent(String key)

+        {

+            AssertUtil.ArgumentNotNull(key, "key");

+

+            IHandler handler = this[key];

+

+            if ( handler != null )

+            {

+                OnComponentUnregistered(handler.ComponentModel, key, handler);

+

+                m_key2Handler.Remove( key );

+

+                HandlerFactory.ReleaseHandler( handler );

+            }

         }

 

         /// <summary>

@@ -112,166 +143,201 @@
         /// Pending

         /// </summary>

         /// <value></value>

-        public event InterceptionDelegate ComponentInterception

+        public event ComponentDataDelegate ComponentUnregistered

         {

-            add { m_events.AddHandler(ComponentInterceptionEvent, value); }

-            remove { m_events.RemoveHandler(ComponentInterceptionEvent, value); }

+            add { m_events.AddHandler(ComponentUnregisteredEvent, value); }

+            remove { m_events.RemoveHandler(ComponentUnregisteredEvent, value); }

         }

 

         /// <summary>

         /// Pending

         /// </summary>

         /// <value></value>

-        public event ComponentInstanceDelegate ComponentCreated

+        public event WrapDelegate ComponentWrap

         {

-            add { m_events.AddHandler(ComponentCreatedEvent, value); }

-            remove { m_events.RemoveHandler(ComponentCreatedEvent, value); }

+            add { m_events.AddHandler(ComponentWrapEvent, value); }

+            remove { m_events.RemoveHandler(ComponentWrapEvent, value); }

         }

 

         /// <summary>

         /// Pending

         /// </summary>

         /// <value></value>

-        public event ComponentInstanceDelegate ComponentDestroyed

+        public event UnWrapDelegate ComponentUnWrap

+        {

+            add { m_events.AddHandler(ComponentUnWrapEvent, value); }

+            remove { m_events.RemoveHandler(ComponentUnWrapEvent, value); }

+        }

+

+        /// <summary>

+        /// Pending

+        /// </summary>

+        /// <value></value>

+        public event ComponentInstanceDelegate ComponentReady

+        {

+            add { m_events.AddHandler(ComponentReadyEvent, value); }

+            remove { m_events.RemoveHandler(ComponentReadyEvent, value); }

+        }

+

+        /// <summary>

+        /// Pending

+        /// </summary>

+        /// <value></value>

+        public event ComponentInstanceDelegate ComponentReleased

+        {

+            add { m_events.AddHandler(ComponentReleasedEvent, value); }

+            remove { m_events.RemoveHandler(ComponentReleasedEvent, value); }

+        }

+

+        /// <summary>

+        /// Pending

+        /// </summary>

+        /// <value></value>

+        public event ComponentModelDelegate ComponentModelConstructed

+        {

+            add { m_events.AddHandler(ComponentModelConstructedEvent, value); }

+            remove { m_events.RemoveHandler(ComponentModelConstructedEvent, value); }

+        }

+

+        /// <summary>

+        /// Adds a subsystem.

+        /// </summary>

+        /// <param name="key">Name of this subsystem</param>

+        /// <param name="system">Subsystem implementation</param>

+        public void AddSubsystem(String key, IKernelSubsystem system)

+        {

+            AssertUtil.ArgumentNotNull(key, "key");

+            AssertUtil.ArgumentNotNull(system, "system");

+

+            system.Init(this);

+

+            m_subsystems[ key ] = system;

+        }

+

+        /// <summary>

+        /// 

+        /// </summary>

+        public IHandler this[String key]

+        {

+            get { return (IHandler) m_key2Handler[ key ]; }

+        }

+

+        public IHandler GetHandler(String key, object criteria)

+        {

+            // TODO: IHandler GetHandler( String key, object criteria )

+            return null;

+        }

+

+        public IHandlerFactory HandlerFactory

+        {

+            get { return m_handlerFactory; }

+            set

+            {

+                AssertUtil.ArgumentNotNull(value, "value");

+                m_handlerFactory = value;

+            }

+        }

+

+        /// <summary>

+        /// 

+        /// </summary>

+        public ILifestyleManagerFactory LifestyleManagerFactory

+        {

+            get { return m_lifestyleManagerFactory; }

+            set

+            {

+                AssertUtil.ArgumentNotNull(value, "value");

+                m_lifestyleManagerFactory = value;

+            }

+        }

+

+        /// <summary>

+        /// 

+        /// </summary>

+        public IInterceptedComponentBuilder InterceptedComponentBuilder

+        {

+            get { return m_interceptedComponentBuilder; }

+            set

+            {

+                AssertUtil.ArgumentNotNull(value, "value");

+                m_interceptedComponentBuilder = value;

+            }

+        }

+

+        /// <summary>

+        /// 

+        /// </summary>

+        public IComponentModelBuilder ModelBuilder

+        {

+            get { return m_componentModelBuilder; }

+            set

+            {

+                AssertUtil.ArgumentNotNull(value, "value");

+                m_componentModelBuilder = value;

+            }

+        }

+

+        /// <summary>

+        /// 

+        /// </summary>

+        /// <param name="service"></param>

+        /// <returns></returns>

+        public bool HasService(Type service)

+        {

+            return m_service2Key.Contains(service);

+        }

+

+        /// <summary>

+        /// 

+        /// </summary>

+        /// <param name="service"></param>

+        /// <param name="depDelegate"></param>

+        public void AddDependencyListener(Type service, DependencyListenerDelegate 
depDelegate)

         {

-            add { m_events.AddHandler(ComponentDestroyedEvent, value); }

-            remove { m_events.RemoveHandler(ComponentDestroyedEvent, value); }

+            lock (m_dependencyToSatisfy)

+            {

+                Delegate del = m_dependencyToSatisfy[ service ] as Delegate;

+

+                if (del == null)

+                {

+                    m_dependencyToSatisfy[ service ] = depDelegate;

+                }

+                else

+                {

+                    del = Delegate.Combine(del, depDelegate);

+                    m_dependencyToSatisfy[ service ] = del;

+                }

+            }

         }

 

         /// <summary>

-               /// Adds a subsystem.

-               /// </summary>

-               /// <param name="key">Name of this subsystem</param>

-               /// <param name="system">Subsystem implementation</param>

-               public void AddSubsystem( String key, IKernelSubsystem system )

-               {

-                       AssertUtil.ArgumentNotNull( key, "key" );

-                       AssertUtil.ArgumentNotNull( system, "system" );

-

-                       system.Init( this );

-

-                       m_subsystems[ key ] = system;

-               }

-

-               /// <summary>

-               /// 

-               /// </summary>

-               public IHandler this [ String key ]

-               {

-                       get

-                       {

-                               return (IHandler) m_components[ key ];

-                       }

-               }

-

-               public IHandler GetHandler( String key, object criteria )

-               {

-                       // TODO: IHandler GetHandler( String key, object criteria )

-                       return null;

-               }

-

-               public IHandlerFactory HandlerFactory

-               {

-                       get

-                       {

-                               return m_handlerFactory;

-                       }

-                       set

-                       {

-                               AssertUtil.ArgumentNotNull( value, "value" );

-                               m_handlerFactory = value;

-                       }

-               }

-

-               /// <summary>

-               /// 

-               /// </summary>

-               public ILifestyleManagerFactory LifestyleManagerFactory

-               {

-                       get

-                       {

-                               return m_lifestyleManagerFactory;

-                       }

-                       set

-                       {

-                               AssertUtil.ArgumentNotNull( value, "value" );

-                               m_lifestyleManagerFactory = value;

-                       }

-               }

-

-               public IComponentModelBuilder ModelBuilder

-               {

-                       get

-                       {

-                               return m_componentModelBuilder;

-                       }

-                       set

-                       {

-                               AssertUtil.ArgumentNotNull( value, "value" );

-                               m_componentModelBuilder = value;

-                       }

-               }

-

-               /// <summary>

-               /// 

-               /// </summary>

-               /// <param name="service"></param>

-               /// <returns></returns>

-               public bool HasService( Type service )

-               {

-                       return m_services.Contains( service );

-               }

-

-               /// <summary>

-               /// 

-               /// </summary>

-               /// <param name="service"></param>

-               /// <param name="depDelegate"></param>

-               public void AddDependencyListener( Type service, 
DependencyListenerDelegate depDelegate )

-               {

-                       lock(m_dependencyToSatisfy)

-                       {

-                               Delegate del = m_dependencyToSatisfy[ service ] as 
Delegate;

-

-                               if (del == null)

-                               {

-                                       m_dependencyToSatisfy[ service ] = depDelegate;

-                               }

-                               else

-                               {

-                                       del = Delegate.Combine( del, depDelegate );

-                                       m_dependencyToSatisfy[ service ] = del;

-                               }

-                       }

-               }

-

-               /// <summary>

-               /// 

-               /// </summary>

-               /// <param name="service"></param>

-               /// <returns></returns>

-               public IHandler GetHandlerForService( Type service )

-               {

-                       return (IHandler) m_services[ service ];

-               }

-

-               /// <summary>

-               /// Returns a registered subsystem;

-               /// </summary>

-               /// <param name="key">Key used when registered subsystem</param>

-               /// <returns>Subsystem implementation</returns>

-               public IKernelSubsystem GetSubsystem( String key )

-               {

-                       return (IKernelSubsystem) m_subsystems[ key ];

-               }

+        /// 

+        /// </summary>

+        /// <param name="service"></param>

+        /// <returns></returns>

+        public IHandler GetHandlerForService(Type service)

+        {

+            String key = (String) m_service2Key[ service ];

+            return key == null ? null : (IHandler) m_key2Handler[ key ];

+        }

+

+        /// <summary>

+        /// Returns a registered subsystem;

+        /// </summary>

+        /// <param name="key">Key used when registered subsystem</param>

+        /// <returns>Subsystem implementation</returns>

+        public IKernelSubsystem GetSubsystem(String key)

+        {

+            return (IKernelSubsystem) m_subsystems[ key ];

+        }

 

-               #endregion

+        #endregion

 

         #region IDisposable Members

 

         public void Dispose()

         {

-            foreach (PairHandlerComponent pair in m_componentsInstances)

+            foreach(PairHandlerComponent pair in m_componentsInstances)

             {

                 pair.Handler.Release(pair.Instance);

             }

@@ -282,45 +348,180 @@
 

         /// <summary>

         /// 

-               /// </summary>

-               protected virtual void InitializeSubsystems()

-               {

+        /// </summary>

+        protected virtual void InitializeSubsystems()

+        {

             // Examples:

-                       // AddSubsystem( KernelConstants.LOOKUP, new 
LookupCriteriaMatcher() );

-                       // AddSubsystem( KernelConstants.EVENTS, new EventManager() );

-               }

+            // AddSubsystem( KernelConstants.LOOKUP, new LookupCriteriaMatcher() );

+            // AddSubsystem( KernelConstants.EVENTS, new EventManager() );

+        }

 

-        protected virtual void RaiseComponentAdded(IComponentModel model, String key, 
IHandler handler)

+        #region RaiseEvents 

+

+        protected virtual void RaiseComponentRegistered(IComponentModel model, String 
key, IHandler handler)

         {

             ComponentDataDelegate eventDelegate = (ComponentDataDelegate) 
m_events[ComponentRegisteredEvent];

-            

+

+            if (eventDelegate != null)

+            {

+                eventDelegate(model, key, handler);

+            }

+        }

+

+        protected virtual void RaiseComponentUnregistered(IComponentModel model, 
String key, IHandler handler)

+        {

+            ComponentDataDelegate eventDelegate = (ComponentDataDelegate) 
m_events[ComponentUnregisteredEvent];

+

             if (eventDelegate != null)

             {

                 eventDelegate(model, key, handler);

             }

         }

 

-        private void OnNewHandler( IComponentModel model, String key, Type service, 
Type implementation, IHandler handler )

-               {

-                       m_services[ service ] = handler;

+        protected virtual void RaiseModelConstructed(IComponentModel model, String 
key)

+        {

+            ComponentModelDelegate eventDelegate = (ComponentModelDelegate) 
m_events[ComponentModelConstructedEvent];

+

+            if (eventDelegate != null)

+            {

+                eventDelegate(model, key);

+            }

+        }

+

+        public virtual void RaiseComponentReadyEvent( IHandler handler, object 
instance )

+        {

+            ComponentInstanceDelegate eventDelegate = (ComponentInstanceDelegate) 
m_events[ComponentReadyEvent];

+

+            if (eventDelegate != null)

+            {

+                IComponentModel model = handler.ComponentModel;

+                String key = (String) m_service2Key[ model.Service ];

+

+                eventDelegate(model, key, handler, instance);

+            }

+        }

+

+        public virtual void RaiseComponentReleasedEvent( IHandler handler, object 
instance )

+        {

+            ComponentInstanceDelegate eventDelegate = (ComponentInstanceDelegate) 
m_events[ComponentReleasedEvent];

 

-            RaiseComponentAdded( model, key, handler );

+            if (eventDelegate != null)

+            {

+                IComponentModel model = handler.ComponentModel;

+                String key = (String) m_service2Key[ model.Service ];

 

-            if (model.ActivationPolicy == Apache.Avalon.Framework.Activation.Start)

+                eventDelegate(model, key, handler, instance);

+            }

+        }

+

+        public virtual object RaiseWrapEvent( IHandler handler, object instance )

+        {

+            WrapDelegate eventDelegate = (WrapDelegate) m_events[ComponentWrapEvent];

+

+            if (eventDelegate != null)

+            {

+                IComponentModel model = handler.ComponentModel;

+                String key = (String) m_service2Key[ model.Service ];

+                IInterceptedComponent wrapper = new InterceptedComponentWrapper( 
m_interceptedComponentBuilder /*, instance, model.Service*/ );

+

+                eventDelegate(model, key, handler, wrapper);

+            }

+

+            return instance;

+        }

+

+        public virtual object RaiseUnWrapEvent( IHandler handler, object instance )

+        {

+            UnWrapDelegate eventDelegate = (UnWrapDelegate) 
m_events[ComponentUnWrapEvent];

+

+            if (eventDelegate != null)

+            {

+                IComponentModel model = handler.ComponentModel;

+                String key = (String) m_service2Key[ model.Service ];

+

+                instance = eventDelegate(model, key, handler, instance);

+            }

+

+            return instance;

+        }

+

+        /// <summary>

+        /// 

+        /// </summary>

+        internal class InterceptedComponentWrapper : IInterceptedComponent

+        {

+            private IInterceptedComponentBuilder m_interceptedComponentBuilder;

+

+            public InterceptedComponentWrapper( IInterceptedComponentBuilder 
interceptedComponentBuilder )

+            {

+                m_interceptedComponentBuilder = interceptedComponentBuilder;

+            }

+

+            public object ProxiedInstance

+            {

+                get { throw new NotImplementedException(); }

+            }

+

+            public void Add(IInterceptor interceptor)

+            {

+                throw new NotImplementedException();

+            }

+

+            public IInterceptor InterceptorChain

+            {

+                get { throw new NotImplementedException(); }

+            }

+        }

+

+        #endregion

+

+        /// <summary>

+        /// Starts the component if the activation policy for 

+        /// the component is 'Start'

+        /// </summary>

+        /// <param name="model">Component model</param>

+        /// <param name="handler">Handler responsible for the component</param>

+        protected virtual void StartComponent(IComponentModel model, IHandler handler)

+        {

+            if (model.ActivationPolicy == Activation.Start)

             {

                 object instance = handler.Resolve();

-                

-                m_componentsInstances.Add( new PairHandlerComponent(handler, 
instance) );

+

+                m_componentsInstances.Add(new PairHandlerComponent(handler, 
instance));

             }

         }

-       }

 

+        private void OnModelConstructed(IComponentModel model, String key)

+        {

+            RaiseModelConstructed(model, key);

+        }

+

+        private void OnComponentRegistered(IComponentModel model, String key, 
IHandler handler)

+        {

+            m_service2Key[ model.Service ] = key;

+

+            RaiseComponentRegistered(model, key, handler);

+

+            StartComponent( model, handler );

+        }

+

+        private void OnComponentUnregistered(IComponentModel model, String key, 
IHandler handler)

+        {

+            m_service2Key.Remove( model.Service );

+

+            RaiseComponentUnregistered(model, key, handler);

+        }

+    }

+

+    /// <summary>

+    /// 

+    /// </summary>

     internal class PairHandlerComponent

     {

         private IHandler m_handler;

         private object m_instance;

 

-        public PairHandlerComponent( IHandler handler, object instance )

+        public PairHandlerComponent(IHandler handler, object instance)

         {

             m_handler = handler;

             m_instance = instance;

@@ -336,4 +537,4 @@
             get { return m_instance; }

         }

     }

-}

+}
\ No newline at end of file

Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Factory/IComponentFactory.cs
==============================================================================
--- 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Factory/IComponentFactory.cs
  (original)
+++ 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Factory/IComponentFactory.cs
  Wed Sep  1 07:45:44 2004
@@ -14,15 +14,12 @@
 
 namespace Apache.Avalon.Castle.MicroKernel
 {
-       using System;
-       using System.Reflection;
-
        /// <summary>
        /// Summary description for IComponentFactory.
        /// </summary>
        public interface IComponentFactory
        {
-               Object Incarnate( );
+               object Incarnate( );
 
                void Etherialize( object instance );
        }

Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/AbstractHandler.cs
==============================================================================
--- 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/AbstractHandler.cs
    (original)
+++ 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/AbstractHandler.cs
    Wed Sep  1 07:45:44 2004
@@ -1,182 +1,182 @@
-// Copyright 2004 The Apache Software Foundation
-// 
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-// 
-//     http://www.apache.org/licenses/LICENSE-2.0
-// 
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-namespace Apache.Avalon.Castle.MicroKernel.Handler
-{
-       using System;
-       using System.Collections;
-
-       using Apache.Avalon.Castle.MicroKernel.Model;
-
-       /// <summary>
-       /// Summary description for AbstractHandler.
-       /// </summary>
-       public abstract class AbstractHandler : IHandler
-       {
-               protected IKernel m_kernel;
-
-               protected IComponentModel m_componentModel;
-
-               protected State m_state = State.Valid;
-
-               protected ArrayList m_dependencies = new ArrayList();
-
-               protected Hashtable m_serv2handler = new Hashtable();
-
-               protected ILifestyleManager m_lifestyleManager;
-
-               private ArrayList m_instances = new ArrayList();
-
-               /// <summary>
-               /// 
-               /// </summary>
-               /// <param name="model"></param>
-               public AbstractHandler( IComponentModel model )
-               {
-                       AssertUtil.ArgumentNotNull( model, "model" );
-
-                       m_componentModel = model;
-               }
-
-               #region IHandler Members
-
-               public virtual void Init( IKernel kernel )
-               {
-                       m_kernel = kernel;
-               }
-
-               public virtual object Resolve()
-               {
-                       if (ActualState == State.WaitingDependency)
-                       {
-                               throw new HandlerException("Can't Resolve component. 
It has dependencies to be satisfied.");
-                       }
-
-                       try
-                       {
-                               object instance = m_lifestyleManager.Resolve();
-
-                // TODO: Proxy

-                // instance = RaiseInterceptorEvent( instance );

-

-                RegisterInstance( instance );
-
-                               return instance;
-                       }
-                       catch(Exception ex)
-                       {
-                               throw new HandlerException("Exception while attempting 
to instantiate type", ex);
-                       }
-               }
-
-               public virtual void Release( object instance )
-               {
-                       if ( IsOwner(instance) )
-                       {
-                               UnregisterInstance( instance );
-                               m_lifestyleManager.Release( instance );
-                       }
-               }
-
-               public virtual bool IsOwner( object instance )
-               {
-                       return HasInstance( instance, false );
-               }
-
-               /// <summary>
-               /// 
-               /// </summary>
-               public virtual State ActualState
-               {
-                       get
-                       {
-                               return m_state;
-                       }
-               }
-
-               #endregion
-
-               protected virtual void RegisterInstance( object instance )
-               {
-                       RaiseComponentCreatedEvent( instance );
-
-                       if (!HasInstance( instance, false ))
-                       {
-                               // WeakReference reference = new WeakReference( 
instance );
-                               // m_instances.Add( reference );
-                               m_instances.Add( instance );
-                       }
-               }
-
-               protected virtual void UnregisterInstance( object instance )
-               {

-            RaiseComponentDestroyedEvent( instance );

-

-            if (m_instances.Count == 0)
-                       {
-                               return;
-                       }
-
-                       HasInstance( instance, true );
-               }
-
-               protected virtual bool HasInstance( object instance, bool 
removeIfFound )
-               {
-                       // foreach( WeakReference reference in m_instances )
-                       foreach( object storedInstance in m_instances )
-                       {
-                               // if (reference.Target == null)
-                               // {
-                               //      m_instances.Remove( reference );
-                               // }
-
-                               if ( Object.ReferenceEquals( instance, storedInstance 
/*reference.Target*/ ) )
-                               {
-                                       if (removeIfFound)
-                                       {
-                                               m_instances.Remove( instance );
-                                       }
-
-                                       return true;
-                               }
-                       }
-
-                       return false;
-               }
-
-               protected virtual void RaiseComponentCreatedEvent( object instance )
-               {

-            ComponentInstanceDelegate createdEvent = m_kernel.ComponentCreated;

-            

-            if (createdEvent == null)

+ // Copyright 2004 The Apache Software Foundation

+// 

+// Licensed under the Apache License, Version 2.0 (the "License");

+// you may not use this file except in compliance with the License.

+// You may obtain a copy of the License at

+// 

+//     http://www.apache.org/licenses/LICENSE-2.0

+// 

+// Unless required by applicable law or agreed to in writing, software

+// distributed under the License is distributed on an "AS IS" BASIS,

+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+// See the License for the specific language governing permissions and

+// limitations under the License.

+

+namespace Apache.Avalon.Castle.MicroKernel.Handler

+{

+    using System;

+    using System.Collections;

+

+    using Apache.Avalon.Castle.MicroKernel.Model;

+

+    /// <summary>

+    /// Summary description for AbstractHandler.

+    /// </summary>

+    public abstract class AbstractHandler : IHandler

+    {

+        protected IKernel m_kernel;

+

+        protected IComponentModel m_componentModel;

+

+        protected State m_state = State.Valid;

+

+        protected IList m_dependencies = new ArrayList();

+

+        protected Hashtable m_serv2handler = new Hashtable();

+

+        protected ILifestyleManager m_lifestyleManager;

+

+        private IList m_instances = new ArrayList();

+

+        /// <summary>

+        /// 

+        /// </summary>

+        /// <param name="model"></param>

+        public AbstractHandler(IComponentModel model)

+        {

+            AssertUtil.ArgumentNotNull(model, "model");

+

+            m_componentModel = model;

+        }

+

+        #region IHandler Members

+

+        public virtual void Init(IKernel kernel)

+        {

+            m_kernel = kernel;

+        }

+

+        public virtual IComponentModel ComponentModel

+        {

+            get { return m_componentModel; }

+        }

+

+        public virtual object Resolve()

+        {

+            if (ActualState == State.WaitingDependency)

             {

-                return;

+                throw new HandlerException(

+                    "Can't Resolve component. " +

+                        "It has dependencies which still to be satisfied.");

             }

 

-            createdEvent( m_componentModel, this, instance );

+            try

+            {

+                object instance = m_lifestyleManager.Resolve();

+

+                instance = RaiseWrapEvent(instance);

+

+                RegisterInstance(instance);

+

+                return instance;

+            }

+            catch(Exception ex)

+            {

+                throw new HandlerException("Exception while attempting to instantiate 
type", ex);

+            }

+        }

+

+        public virtual void Release(object instance)

+        {

+            if (IsOwner(instance))

+            {

+                instance = RaiseUnWrapEvent(instance);

+                UnregisterInstance(instance);

+                m_lifestyleManager.Release(instance);

+            }

         }

 

-        protected virtual void RaiseComponentDestroyedEvent(object instance)

+        public virtual bool IsOwner(object instance)

         {

-            ComponentInstanceDelegate destroyedEvent = m_kernel.ComponentDestroyed;

+            return HasInstance(instance, false);

+        }

+

+        /// <summary>

+        /// 

+        /// </summary>

+        public virtual State ActualState

+        {

+            get { return m_state; }

+        }

 

-            if (destroyedEvent == null)

+        #endregion

+

+        protected virtual void RegisterInstance(object instance)

+        {

+            if (!HasInstance(instance, false))

+            {

+                // WeakReference reference = new WeakReference( instance );

+                // m_instances.Add( reference );

+                m_instances.Add(instance);

+            }

+

+            RaiseComponentReadyEvent(instance);

+        }

+

+        protected virtual void UnregisterInstance(object instance)

+        {

+            RaiseComponentReleasedEvent(instance);

+

+            if (m_instances.Count == 0)

             {

                 return;

             }

 

-            destroyedEvent(m_componentModel, this, instance);

+            HasInstance(instance, true);

+        }

+

+        protected virtual bool HasInstance(object instance, bool removeIfFound)

+        {

+            // foreach( WeakReference reference in m_instances )

+            foreach(object storedInstance in m_instances)

+            {

+                // if (reference.Target == null)

+                // {

+                //     m_instances.Remove( reference );

+                // }

+

+                if (Object.ReferenceEquals(instance, storedInstance 
/*reference.Target*/))

+                {

+                    if (removeIfFound)

+                    {

+                        m_instances.Remove(instance);

+                    }

+

+                    return true;

+                }

+            }

+

+            return false;

+        }

+

+        protected virtual object RaiseWrapEvent(object instance)

+        {

+            return m_kernel.RaiseWrapEvent(this, instance);

+        }

+

+        protected virtual object RaiseUnWrapEvent(object instance)

+        {

+            return m_kernel.RaiseUnWrapEvent(this, instance);

+        }

+

+        protected virtual void RaiseComponentReadyEvent(object instance)

+        {

+            m_kernel.RaiseComponentReadyEvent(this, instance);

+        }

+

+        protected virtual void RaiseComponentReleasedEvent(object instance)

+        {

+            m_kernel.RaiseComponentReleasedEvent(this, instance);

         }

-    }
-}
+    }

+}
\ No newline at end of file

Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandler.cs
==============================================================================
--- 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandler.cs
     (original)
+++ 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandler.cs
     Wed Sep  1 07:45:44 2004
@@ -14,8 +14,6 @@
 
 namespace Apache.Avalon.Castle.MicroKernel.Handler.Default
 {
-       using System;
-
        using Apache.Avalon.Castle.MicroKernel.Model;
        using Apache.Avalon.Castle.MicroKernel.Concerns;
        using Apache.Avalon.Castle.MicroKernel.Factory.Default;

Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandlerFactory.cs
==============================================================================
--- 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandlerFactory.cs
      (original)
+++ 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandlerFactory.cs
      Wed Sep  1 07:45:44 2004
@@ -34,6 +34,10 @@
                        return new DefaultHandler( model );
                }
 
+        public virtual void ReleaseHandler( IHandler handler )

+        {

+        }
+
                #endregion
        }
 }

Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/SimpleHandler.cs
==============================================================================
--- 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/SimpleHandler.cs
      (original)
+++ 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/SimpleHandler.cs
      Wed Sep  1 07:45:44 2004
@@ -15,8 +15,6 @@
 namespace Apache.Avalon.Castle.MicroKernel.Handler.Default
 {
        using System;
-       using System.Collections;
-       using System.Reflection;
 
        using Apache.Avalon.Castle.MicroKernel.Model;
 
@@ -28,8 +26,7 @@
                /// <summary>
                /// 
                /// </summary>
-               /// <param name="service"></param>
-               /// <param name="implementation"></param>
+               /// <param name="model"></param>
                public SimpleHandler( IComponentModel model ) : base( model )
                {
                }
@@ -101,8 +98,6 @@
                protected virtual void CreateComponentFactoryAndLifestyleManager()
                {
                        IComponentFactory factory = new 
Factory.Default.SimpleComponentFactory( 
-                               // m_kernel.GetAspects(AspectPointCutFlags.Before), 
-                               // m_kernel.GetAspects(AspectPointCutFlags.After), 
                                m_componentModel, m_serv2handler);
 
                        m_lifestyleManager = m_kernel.LifestyleManagerFactory.Create( 

Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/SimpleHandlerFactory.cs
==============================================================================
--- 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/SimpleHandlerFactory.cs
       (original)
+++ 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/Default/SimpleHandlerFactory.cs
       Wed Sep  1 07:45:44 2004
@@ -34,6 +34,10 @@
                        return new SimpleHandler( model );
                }
 
+        public virtual void ReleaseHandler( IHandler handler )

+        {

+        }
+
                #endregion
        }
 }

Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/IHandler.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/IHandler.cs  
 (original)
+++ avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/IHandler.cs  
 Wed Sep  1 07:45:44 2004
@@ -1,4 +1,4 @@
- // Copyright 2004 The Apache Software Foundation

+// Copyright 2004 The Apache Software Foundation

 // 

 // Licensed under the Apache License, Version 2.0 (the "License");

 // you may not use this file except in compliance with the License.

@@ -14,7 +14,7 @@
 

 namespace Apache.Avalon.Castle.MicroKernel

 {

-       using System;

+    using Apache.Avalon.Castle.MicroKernel.Model;

 

        /// <summary>

        /// Summary description for IHandler.

@@ -38,5 +38,10 @@
                /// <param name="instance"></param>

                /// <returns></returns>

                bool IsOwner(object instance);

+

+        /// <summary>

+        /// 

+        /// </summary>

+           IComponentModel ComponentModel { get; }

        }

 }

Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/IHandlerFactory.cs
==============================================================================
--- 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/IHandlerFactory.cs
    (original)
+++ 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/IHandlerFactory.cs
    Wed Sep  1 07:45:44 2004
@@ -24,5 +24,7 @@
        public interface IHandlerFactory
        {
                IHandler CreateHandler( IComponentModel model );
+
+        void ReleaseHandler( IHandler handler );
        }
 }

Modified: avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/IKernel.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/IKernel.cs    
(original)
+++ avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/IKernel.cs    Wed 
Sep  1 07:45:44 2004
@@ -17,6 +17,7 @@
        using System;

 

        using Apache.Avalon.Castle.MicroKernel.Model;

+    using Apache.Avalon.Castle.MicroKernel.Interceptor;

 

        public delegate void DependencyListenerDelegate( Type service, IHandler 
handler );

 

@@ -33,6 +34,12 @@
                /// <param name="implementation">The actual implementation</param>

                void AddComponent(String key, Type service, Type implementation);

 

+               /// <summary>

+               /// 

+               /// </summary>

+               /// <param name="key"></param>

+               void RemoveComponent(String key);

+

         /// <summary>

                /// IComponentModel instance builder.

                /// </summary>

@@ -99,5 +106,10 @@
                /// <param name="key">Key used when registered subsystem</param>

                /// <returns>Subsystem implementation</returns>

                IKernelSubsystem GetSubsystem(String key);

+

+        /// <summary>

+        /// 

+        /// </summary>

+        IInterceptedComponentBuilder InterceptedComponentBuilder  { get; set; }

        }

 }

Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/IKernelEvents.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/IKernelEvents.cs     
 (original)
+++ avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/IKernelEvents.cs     
 Wed Sep  1 07:45:44 2004
@@ -21,9 +21,13 @@
 

     public delegate void ComponentDataDelegate( IComponentModel model, String key, 
IHandler handler );

 

-       public delegate void InterceptionDelegate( IComponentModel model, IHandler 
handler, IInterceptedComponent interceptedComponent );

+       public delegate void WrapDelegate( IComponentModel model, String key, IHandler 
handler, IInterceptedComponent interceptedComponent );

 

-       public delegate void ComponentInstanceDelegate( IComponentModel model, 
IHandler handler, object instance );

+    public delegate object UnWrapDelegate( IComponentModel model, String key, 
IHandler handler, object instance );

+

+       public delegate void ComponentInstanceDelegate( IComponentModel model, String 
key, IHandler handler, object instance );

+

+       public delegate void ComponentModelDelegate( IComponentModel model, String key 
);

 

     /// <summary>

     /// 

@@ -35,19 +39,64 @@
         /// </summary>

         event ComponentDataDelegate ComponentRegistered;

 

+               /// <summary>

+               /// 

+               /// </summary>

+               event ComponentDataDelegate ComponentUnregistered;

+

+               /// <summary>

+               /// 

+               /// </summary>

+               event WrapDelegate ComponentWrap;

+

+               /// <summary>

+               /// 

+               /// </summary>

+               event UnWrapDelegate ComponentUnWrap;

+

+               /// <summary>

+               /// 

+               /// </summary>

+               event ComponentInstanceDelegate ComponentReady;

+

+               /// <summary>

+               /// 

+               /// </summary>

+               event ComponentInstanceDelegate ComponentReleased;

+

+               /// <summary>

+               /// 

+               /// </summary>

+               event ComponentModelDelegate ComponentModelConstructed;

+

         /// <summary>

         /// 

         /// </summary>

-        event InterceptionDelegate ComponentInterception;

+        /// <param name="instance"></param>

+        /// <param name="handler"></param>

+        /// <returns></returns>

+        object RaiseWrapEvent( IHandler handler, object instance );

 

         /// <summary>

-               /// 

-               /// </summary>

-        event ComponentInstanceDelegate ComponentCreated;

+        /// 

+        /// </summary>

+        /// <param name="instance"></param>

+        /// <param name="handler"></param>

+        /// <returns></returns>

+        object RaiseUnWrapEvent( IHandler handler, object instance );

 

         /// <summary>

-               /// 

-               /// </summary>

-               event ComponentInstanceDelegate ComponentDestroyed;

-       }

+        /// 

+        /// </summary>

+        /// <param name="instance"></param>

+        /// <param name="handler"></param>

+        void RaiseComponentReadyEvent( IHandler handler, object instance );

+

+        /// <summary>

+        /// 

+        /// </summary>

+        /// <param name="instance"></param>

+        /// <param name="handler"></param>

+        void RaiseComponentReleasedEvent( IHandler handler, object instance );

+    }

 }


Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/AbstractHandlerTestCase.cs
==============================================================================
--- 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/AbstractHandlerTestCase.cs
    (original)
+++ 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/AbstractHandlerTestCase.cs
    Wed Sep  1 07:45:44 2004
@@ -94,7 +94,7 @@
                        public override object Resolve()
                        {
                                object instance = new object();
-                               base.RegisterInstance( ref instance );
+                               base.RegisterInstance( instance );
                                return instance;
                        }
                
@@ -139,7 +139,7 @@
 
                        public override object Resolve()
                        {
-                               base.RegisterInstance( ref instance );
+                               base.RegisterInstance( instance );
                                return instance;
                        }
                

Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/Apache.Avalon.Castle.MicroKernel.Test.csproj
==============================================================================
--- 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/Apache.Avalon.Castle.MicroKernel.Test.csproj
  (original)
+++ 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/Apache.Avalon.Castle.MicroKernel.Test.csproj
  Wed Sep  1 07:45:44 2004
@@ -144,6 +144,11 @@
                     BuildAction = "Compile"

                 />

                 <File

+                    RelPath = "KernelEventsTestCase.cs"

+                    SubType = "Code"

+                    BuildAction = "Compile"

+                />

+                <File

                     RelPath = "LoggerManagerTestCase.cs"

                     SubType = "Code"

                     BuildAction = "Compile"


Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/BaseKernelTestCase.cs
==============================================================================
--- 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/BaseKernelTestCase.cs
 (original)
+++ 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/BaseKernelTestCase.cs
 Wed Sep  1 07:45:44 2004
@@ -14,10 +14,6 @@
 
 namespace Apache.Avalon.Castle.MicroKernel.Test
 {
-       using System;
-       using System.Reflection;
-       using System.Collections;
-
        using NUnit.Framework;
 
        using Apache.Avalon.Castle.MicroKernel;
@@ -49,6 +45,24 @@
 
                        handler.Release( service );
                }
+
+        [Test]
+        public void AddAndRemove()
+        {
+            BaseKernel container = new BaseKernel();
+            container.AddComponent( "a", typeof(IMailService), 
typeof(SimpleMailService) );
+
+            AssertNotNull( container.GetHandlerForService( typeof(IMailService) ) );
+            AssertNotNull( container[ "a" ] );
+
+            AssertNull( container.GetHandlerForService( typeof(IMailMarketingService) 
) );
+            AssertNull( container[ "b" ] );
+
+            container.RemoveComponent( "a" );
+
+            AssertNull( container.GetHandlerForService( typeof(IMailService) ) );
+            AssertNull( container[ "a" ] );
+        }
 
                [Test]
                public void ComponentDependingOnLogger()

Modified: 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/KernelEventsTestCase.cs
==============================================================================
--- 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/KernelEventsTestCase.cs
       (original)
+++ 
avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/KernelEventsTestCase.cs
       Wed Sep  1 07:45:44 2004
@@ -14,89 +14,197 @@
 

 namespace Apache.Avalon.Castle.MicroKernel.Test

 {

-       using System;

+    using System;

 

-       using NUnit.Framework;

+    using NUnit.Framework;

 

-       using Apache.Avalon.Castle.MicroKernel;

+    using Apache.Avalon.Castle.MicroKernel;
     using Apache.Avalon.Castle.MicroKernel.Model;

-    using Apache.Avalon.Castle.MicroKernel.Test.Components;

+    using Apache.Avalon.Castle.MicroKernel.Test.Components;
 

        /// <summary>

-    /// Summary description for KernelEventsTestCase.

-    /// </summary>

+       /// Summary description for KernelEventsTestCase.

+       /// </summary>

        [TestFixture]

-       public class KernelEventsTestCase : Assertion

+    public class KernelEventsTestCase : Assertion

        {

-               private bool m_componentAdded = false;

-               private bool m_componentCreated = false;

-               private bool m_componentDestroyed = false;

-

-               [Test]

-               public void TestComponentAddedEvent()

-               {

-                       IKernel kernel = new DefaultAvalonKernel();

-

-            kernel.ComponentAdded += new ComponentDataDelegate(OnComponentAdded);

-

-            kernel.AddComponent( "key", typeof(IMailService), 
typeof(SimpleMailService) );

-

-                       Assert( m_componentAdded );

-               }

-

-        public void OnComponentAdded(IComponentModel model, String key, Type service, 
Type implementation, IHandler handler)

+        private bool m_registered = false;

+        private bool m_unregistered = false;

+        private bool m_modelConstructed = false;

+        private bool m_wrap = false;

+        private bool m_unwrap= false;

+        private bool m_ready = false;

+        private bool m_released = false;

+

+        [Test]
+        public void RegisteredAndUnregistered()
+        {
+            BaseKernel container = new BaseKernel();
+
+            container.ComponentRegistered += new ComponentDataDelegate(Registered);
+            container.ComponentUnregistered += new 
ComponentDataDelegate(Unregistered);
+
+            Assert(!m_registered);
+            Assert(!m_unregistered);
+
+            container.AddComponent( "a", typeof(IMailService), 
typeof(SimpleMailService) );
+
+            Assert(m_registered);
+            Assert(!m_unregistered);
+
+            m_registered = false;
+
+            container.RemoveComponent( "a" );
+
+            Assert(!m_registered);
+            Assert(m_unregistered);
+        }
+
+        [Test]
+        public void ModelConstructed()
+        {
+            BaseKernel container = new BaseKernel();
+
+            container.ComponentModelConstructed += new 
ComponentModelDelegate(ComponentModelConstructed);
+
+            Assert(!m_modelConstructed);
+
+            container.AddComponent( "a", typeof(IMailService), 
typeof(SimpleMailService) );
+
+            Assert(m_modelConstructed);
+
+            m_modelConstructed = false;
+
+            container.RemoveComponent( "a" );
+
+            Assert(!m_modelConstructed);
+        }
+
+        [Test]
+        public void WrapAndUnwrap()

         {

-                       m_componentAdded = true;

-               }

-

-        /*

-               [Test]

-               public void TestComponentCreatedEvent()

-               {

-                       IKernel kernel = new DefaultAvalonKernel();

-

-            kernel.ComponentCreated += new KernelDelegate(OnComponentCreated);

+            BaseKernel container = new BaseKernel();
+
+            container.ComponentWrap += new WrapDelegate(ComponentWrap);
+            container.ComponentUnWrap += new UnWrapDelegate(ComponentUnWrap);
+
+            container.AddComponent( "a", typeof(IMailService), 
typeof(SimpleMailService) );
+
+            Assert(!m_wrap);
+            Assert(!m_unwrap);
+
+            IHandler handler = container[ "a" ];
+
+            IMailService service = handler.Resolve() as IMailService;
+
+            Assert(m_wrap);
+            Assert(!m_unwrap);
+            m_wrap = false;
+
+            service.Send("hammett at apache dot org", "johndoe at yahoo dot org", 
"Aloha!", "What's up?");
+
+            handler.Release( service );
+
+            Assert(!m_wrap);
+            Assert(m_unwrap);
+        }
+
+        [Test]
+        public void ReadyAndRelease()

+        {

+            BaseKernel container = new BaseKernel();
+
+            container.ComponentReady += new ComponentInstanceDelegate(ComponentReady);
+            container.ComponentReleased += new 
ComponentInstanceDelegate(ComponentReleased);
+
+            container.AddComponent( "a", typeof(IMailService), 
typeof(SimpleMailService) );
+
+            Assert(!m_ready);
+            Assert(!m_released);
+
+            IHandler handler = container[ "a" ];
+
+            IMailService service = handler.Resolve() as IMailService;
+
+            Assert(m_ready);
+            Assert(!m_released);
+            m_ready = false;
+
+            service.Send("hammett at apache dot org", "johndoe at yahoo dot org", 
"Aloha!", "What's up?");
+
+            handler.Release( service );
+
+            Assert(!m_ready);
+            Assert(m_released);
+        }
+
+        private void Registered(IComponentModel model, String key, IHandler handler)

+        {

+            AssertNotNull( model );

+            AssertNotNull( key );

+            AssertNotNull( handler );

+            AssertEquals( "a", key );

 

-            kernel.AddComponent( "key", typeof(IMailService), 
typeof(SimpleMailService) );

+            m_registered = true;

+        }
 

-                       Assert( !m_componentCreated );

+        private void Unregistered(IComponentModel model, String key, IHandler handler)

+        {

+            AssertNotNull( model );

+            AssertNotNull( key );

+            AssertNotNull( handler );

+            AssertEquals( "a", key );

 

-                       kernel[ "key" ].Resolve();

+            m_unregistered = true;

+        }

 

-                       Assert( m_componentCreated );

-               }

+        private void ComponentModelConstructed(IComponentModel model, String key)

+        {

+            AssertNotNull( model );

+            AssertNotNull( key );

 

-       public void OnComponentCreated( EventManagerData data )

-               {

-                       m_componentCreated = true;

-               }*/

+            m_modelConstructed = true;

+        }

 

-        /*

-               [Test]

-               public void TestComponentDestroyedEvent()

-               {

-                       IKernel kernel = new DefaultAvalonKernel();

+        private void ComponentWrap(IComponentModel model, String key, IHandler 
handler, Apache.Avalon.Castle.MicroKernel.Interceptor.IInterceptedComponent 
interceptedComponent)

+        {

+            AssertNotNull( model );

+            AssertNotNull( key );

+            AssertNotNull( handler );

 

-                       IEventManager eventManager = (IEventManager) 
kernel.GetSubsystem( KernelConstants.EVENTS );

-                       eventManager.ComponentDestroyed += new 
KernelDelegate(OnComponentDestroyed);

+            m_wrap = true;

+        }

 

-                       kernel.AddComponent( "key", typeof(IMailService), 
typeof(SimpleMailService) );

+        private object ComponentUnWrap(IComponentModel model, String key, IHandler 
handler, object instance)

+        {

+            AssertNotNull( model );

+            AssertNotNull( key );

+            AssertNotNull( handler );

+            AssertNotNull( instance );

 

-                       Assert( !m_componentDestroyed );

+            m_unwrap = true;

 

-                       object instance = kernel[ "key" ].Resolve();

+            return instance;

+        }

 

-                       Assert( !m_componentDestroyed );

+        private void ComponentReady(IComponentModel model, String key, IHandler 
handler, object instance)

+        {

+            AssertNotNull( model );

+            AssertNotNull( key );

+            AssertNotNull( handler );

+            AssertNotNull( instance );

 

-                       kernel[ "key" ].Release( instance );

+            m_ready = true;

+        }

 

-                       Assert( m_componentDestroyed );

-               }

+        private void ComponentReleased(IComponentModel model, String key, IHandler 
handler, object instance)

+        {

+            AssertNotNull( model );

+            AssertNotNull( key );

+            AssertNotNull( handler );

+            AssertNotNull( instance );

 

-               public void OnComponentDestroyed( EventManagerData data )

-               {

-                       m_componentDestroyed = true;

-               }

-        */

+            m_released = true;

+        }

     }

 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to