svn commit: rev 37216 - in avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel: . Handler MicroKernelTest Model/Default

[email protected] 30 Aug 2004 21:27:55 -0000
Newsgroups gmane.comp.jakarta.avalon.cvs
Message-ID <[email protected]>
Author: hammett
Date: Mon Aug 30 14:27:53 2004
New Revision: 37216

Added:
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/IKernelEvents.cs
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/KernelEventsTestCase.cs
Removed:
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/EventManagerTestCase.cs
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/EventSubsystemTestCase.cs
Modified:
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/BaseKernel.cs
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Handler/AbstractHandler.cs
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/IKernel.cs
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Model/Default/DefaultComponentModel.cs
   avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Model/Default/DefaultComponentModelBuilder.cs
Log:
More refactoring.

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	Mon Aug 30 14:27:53 2004
@@ -1,271 +1,313 @@
-// 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
-{
-	using System;
-	using System.Collections;
-
-	using Apache.Avalon.Castle.MicroKernel.Model;
-	using Apache.Avalon.Castle.MicroKernel.Subsystems.Lookup.Default;
-	using Apache.Avalon.Castle.MicroKernel.Subsystems.Events;
-	using Apache.Avalon.Castle.MicroKernel.Subsystems.Events.Default;
-
-	/// <summary>
-	/// Base implementation of <see cref="IKernel"/>
-	/// </summary>
-	public class BaseKernel : IKernel
-	{
-		protected Hashtable m_components;
-
-		protected Hashtable m_services;
-
-		protected Hashtable m_subsystems;
-
-		protected Hashtable m_dependencyToSatisfy;
-
-		protected IHandlerFactory m_handlerFactory;
-
-		protected IComponentModelBuilder m_componentModelBuilder;
-
-		protected ILifestyleManagerFactory m_lifestyleManagerFactory;
-
-		/// <summary>
-		/// 
-		/// </summary>
-		public BaseKernel()
-		{
-			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 );
+// 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
+{
+	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
+	{
+        private static readonly object ComponentAddedEvent = new object();
+        private static readonly object ComponentCreatedEvent = new object();
+        private static readonly object ComponentDestroyedEvent = new object();
+
+        protected EventHandlerList m_events;
+
+        protected IList m_componentsInstances = new ArrayList();
+
+        protected Hashtable m_components;
+
+		protected Hashtable m_services;
+
+		protected Hashtable m_subsystems;
+
+		protected Hashtable m_dependencyToSatisfy;
+
+		protected IHandlerFactory m_handlerFactory;
+
+		protected IComponentModelBuilder m_componentModelBuilder;
+
+		protected ILifestyleManagerFactory m_lifestyleManagerFactory;
+
+		/// <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 Kernel Members
-
+		#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" );
-			
-			if (!service.IsInterface)
-			{
-				throw new ArgumentException("service must be an interface");
-			}
-			if (implementation.IsInterface)
-			{
-				throw new ArgumentException("implementation can't be an interface");
-			}
-			if (!service.IsAssignableFrom(implementation))
-			{
-				throw new ArgumentException("The specified implementation does not implement the service interface");
-			}
-
-			IComponentModel model = ModelBuilder.BuildModel( key, service, implementation );
-
-			IHandler handler = HandlerFactory.CreateHandler( model );
-			handler.Init ( this );
-
-			m_components[ key ] = handler;
-
-			OnNewHandler( key, service, implementation, handler );
-		}
-
-		/// <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 ];
-		}
-
-		#endregion
-
+		public void AddComponent( String key, Type service, Type implementation )
+		{
+			AssertUtil.ArgumentNotNull( key, "key" );
+			AssertUtil.ArgumentNotNull( service, "service" );
+			AssertUtil.ArgumentNotNull( implementation, "implementation" );
+			
+			if (!service.IsInterface)
+			{
+				throw new ArgumentException("service must be an interface");
+			}
+			if (implementation.IsInterface)
+			{
+				throw new ArgumentException("implementation can't be an interface");
+			}
+            if (implementation.IsAbstract)
+            {
+                throw new ArgumentException("implementation can't be abstract");
+            }
+            if (!service.IsAssignableFrom(implementation))
+            {
+				throw new ArgumentException("The specified implementation does not implement the service interface");
+			}
+
+			IComponentModel model = ModelBuilder.BuildModel( key, service, implementation );
+
+			IHandler handler = HandlerFactory.CreateHandler( model );
+			handler.Init ( this );
+
+			m_components[ key ] = handler;
+
+            OnNewHandler( model, key, service, implementation, handler);
+        }
+
+        public event ComponentDataDelegate ComponentAdded
+        {
+            add { m_events.AddHandler(ComponentAddedEvent, value); }
+            remove { m_events.RemoveHandler(ComponentAddedEvent, 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_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 ];
+		}
+
+		#endregion
+
+        #region IDisposable Members
+
+        public void Dispose()
+        {
+            foreach (PairHandlerComponent pair in m_componentsInstances)
+            {
+                pair.Handler.Release(pair.Instance);
+            }
+            m_componentsInstances.Clear();
+        }
+
+        #endregion
+
+        /// <summary>
+        /// 
+		/// </summary>
 		protected virtual void InitializeSubsystems()
 		{
-			AddSubsystem( KernelConstants.LOOKUP, new LookupCriteriaMatcher() );
-			AddSubsystem( KernelConstants.EVENTS, new EventManager() );
+            // Examples:
+			// AddSubsystem( KernelConstants.LOOKUP, new LookupCriteriaMatcher() );
+			// AddSubsystem( KernelConstants.EVENTS, new EventManager() );
 		}
-
-		private void OnNewHandler( String key, Type service, Type implementation, IHandler handler )
-		{
-			m_services[ service ] = handler;
-			
-			RaiseDependencyEvent( service, handler );
-			RaiseSubsystemNewComponentEvent( key, service, implementation );
-		}
-
-		private void RaiseDependencyEvent( Type service, IHandler handler )
-		{
-			lock(m_dependencyToSatisfy)
-			{
-				if (!m_dependencyToSatisfy.Contains( service ))
-				{
-					return;
-				}
-
-				DependencyListenerDelegate del = (DependencyListenerDelegate) m_dependencyToSatisfy[ service ];
-				del( service, handler );
-
-				m_dependencyToSatisfy.Remove( service );
-			}
-		}
-
-		private void RaiseSubsystemNewComponentEvent( String key, Type service, Type implementation )
-		{
-			IEventManager eventManager = (IEventManager) GetSubsystem( KernelConstants.EVENTS );
-
-			if (eventManager == null)
-			{
-				return;
-			}
-
-			eventManager.OnComponentAdded( new EventManagerData( key, service, implementation ) );
-		}
-	}
-}
+
+        protected virtual void RaiseComponentAdded(IComponentModel model, String key, Type service, Type implementation, IHandler handler)
+        {
+            ComponentDataDelegate eventDelegate = (ComponentDataDelegate) m_events[ComponentAddedEvent];
+            
+            if (eventDelegate != null)
+            {
+                eventDelegate(model, key, service, implementation, handler);
+            }
+        }
+
+        private void OnNewHandler( IComponentModel model, String key, Type service, Type implementation, IHandler handler )
+		{
+			m_services[ service ] = handler;
+
+            RaiseComponentAdded( model, key, service, implementation, handler );
+
+            if (model.ActivationPolicy == Apache.Avalon.Framework.Activation.Start)
+            {
+                object instance = handler.Resolve();
+                
+                m_componentsInstances.Add( new PairHandlerComponent(handler, instance) );
+            }
+        }
+	}
+
+    internal class PairHandlerComponent
+    {
+        private IHandler m_handler;
+        private object m_instance;
+
+        public PairHandlerComponent( IHandler handler, object instance )
+        {
+            m_handler = handler;
+            m_instance = instance;
+        }
+
+        public IHandler Handler
+        {
+            get { return m_handler; }
+        }
+
+        public object Instance
+        {
+            get { return m_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	Mon Aug 30 14:27:53 2004
@@ -18,7 +18,6 @@
 	using System.Collections;
 
 	using Apache.Avalon.Castle.MicroKernel.Model;
-	using Apache.Avalon.Castle.MicroKernel.Subsystems.Events;
 
 	/// <summary>
 	/// Summary description for AbstractHandler.
@@ -108,7 +107,7 @@
 
 		protected virtual void RegisterInstance( ref object instance )
 		{
-			RaiseComponentCreatedEvent( ref instance );
+			// RaiseComponentCreatedEvent( ref instance );
 
 			if (!HasInstance( instance, false ))
 			{
@@ -120,7 +119,7 @@
 
 		protected virtual void UnregisterInstance( object instance )
 		{
-			RaiseComponentCreatedEvent( instance );
+			// RaiseComponentCreatedEvent( instance );
 
 			if (m_instances.Count == 0)
 			{
@@ -154,6 +153,7 @@
 			return false;
 		}
 
+        /*
 		protected virtual void RaiseComponentCreatedEvent( ref object instance )
 		{
 			IEventManager eventManager = (IEventManager) m_kernel.GetSubsystem( KernelConstants.EVENTS );
@@ -181,5 +181,6 @@
 				eventManager.OnComponentDestroyed( data );
 			}
 		}
+        */
 	}
 }

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	Mon Aug 30 14:27:53 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.
@@ -18,13 +18,13 @@
 
 	using Apache.Avalon.Castle.MicroKernel.Model;
 
-	public delegate void DependencyListenerDelegate(Type service, IHandler handler);
+	public delegate void DependencyListenerDelegate( Type service, IHandler handler );
 
-	/// <summary>
+    /// <summary>
 	/// Defines the Kernel service
 	/// </summary>
-	public interface IKernel
-	{
+    public interface IKernel : IKernelEvents
+    {
 		/// <summary>
 		/// Adds a component to kernel.
 		/// </summary>
@@ -33,7 +33,7 @@
 		/// <param name="implementation">The actual implementation</param>
 		void AddComponent(String key, Type service, Type implementation);
 
-		/// <summary>
+        /// <summary>
 		/// IComponentModel instance builder.
 		/// </summary>
 		IComponentModelBuilder ModelBuilder { get; set; }

Added: avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/IKernelEvents.cs
==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/IKernelEvents.cs	Mon Aug 30 14:27:53 2004
@@ -0,0 +1,33 @@
+// 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
+{
+	using System;
+
+	using Apache.Avalon.Castle.MicroKernel.Model;
+
+    public delegate void ComponentDataDelegate( IComponentModel model, String key, Type service, Type implementation, IHandler handler );
+
+    /// <summary>
+    /// 
+    /// </summary>
+    public interface IKernelEvents
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        event ComponentDataDelegate ComponentAdded;
+    }
+}

Added: avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/KernelEventsTestCase.cs
==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/MicroKernelTest/KernelEventsTestCase.cs	Mon Aug 30 14:27:53 2004
@@ -0,0 +1,102 @@
+// 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.Test
+{
+	using System;
+
+	using NUnit.Framework;
+
+	using Apache.Avalon.Castle.MicroKernel;
+    using Apache.Avalon.Castle.MicroKernel.Model;
+    using Apache.Avalon.Castle.MicroKernel.Test.Components;
+
+	/// <summary>
+    /// Summary description for KernelEventsTestCase.
+    /// </summary>
+	[TestFixture]
+	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)
+        {
+			m_componentAdded = true;
+		}
+
+        /*
+		[Test]
+		public void TestComponentCreatedEvent()
+		{
+			IKernel kernel = new DefaultAvalonKernel();
+
+            kernel.ComponentCreated += new KernelDelegate(OnComponentCreated);
+
+            kernel.AddComponent( "key", typeof(IMailService), typeof(SimpleMailService) );
+
+			Assert( !m_componentCreated );
+
+			kernel[ "key" ].Resolve();
+
+			Assert( m_componentCreated );
+		}
+
+    	public void OnComponentCreated( EventManagerData data )
+		{
+			m_componentCreated = true;
+		}*/
+
+        /*
+		[Test]
+		public void TestComponentDestroyedEvent()
+		{
+			IKernel kernel = new DefaultAvalonKernel();
+
+			IEventManager eventManager = (IEventManager) kernel.GetSubsystem( KernelConstants.EVENTS );
+			eventManager.ComponentDestroyed += new KernelDelegate(OnComponentDestroyed);
+
+			kernel.AddComponent( "key", typeof(IMailService), typeof(SimpleMailService) );
+
+			Assert( !m_componentDestroyed );
+
+			object instance = kernel[ "key" ].Resolve();
+
+			Assert( !m_componentDestroyed );
+
+			kernel[ "key" ].Release( instance );
+
+			Assert( m_componentDestroyed );
+		}
+
+		public void OnComponentDestroyed( EventManagerData data )
+		{
+			m_componentDestroyed = true;
+		}
+        */
+    }
+}

Modified: avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Model/Default/DefaultComponentModel.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Model/Default/DefaultComponentModel.cs	(original)
+++ avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Model/Default/DefaultComponentModel.cs	Mon Aug 30 14:27:53 2004
@@ -55,35 +55,10 @@
 			m_name = data.Name;
 			m_service = service;
 			m_lifestyle = data.SupportedLifestyle;
-			m_activation = data.AvalonComponent.Activation;
-			m_logger = logger;
+            m_activation = data.ActivationPolicy;
+            m_logger = logger;
 			m_config = configuration;
 			m_dependencies = data.DependencyModel;
-			m_constructionModel = constructionModel;
-		}
-
-		public DefaultComponentModel(
-			String name,
-			Type service,
-			Lifestyle lifestyle,
-			ILogger logger,
-			IConfiguration configuration,
-			IDependencyModel[] dependencies,
-			IConstructionModel constructionModel) : this()
-		{
-			AssertUtil.ArgumentNotNull(name, "name");
-			AssertUtil.ArgumentNotNull(service, "service");
-			AssertUtil.ArgumentNotNull(logger, "logger");
-			AssertUtil.ArgumentNotNull(configuration, "configuration");
-			AssertUtil.ArgumentNotNull(dependencies, "dependencies");
-			AssertUtil.ArgumentNotNull(constructionModel, "constructionModel");
-
-			m_name = name;
-			m_service = service;
-			m_lifestyle = lifestyle;
-			m_logger = logger;
-			m_config = configuration;
-			m_dependencies = dependencies;
 			m_constructionModel = constructionModel;
 		}
 

Modified: avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Model/Default/DefaultComponentModelBuilder.cs
==============================================================================
--- avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Model/Default/DefaultComponentModelBuilder.cs	(original)
+++ avalon/trunk/central/laboratory/avalon-net/Castle/MicroKernel/Model/Default/DefaultComponentModelBuilder.cs	Mon Aug 30 14:27:53 2004
@@ -355,9 +355,22 @@
 
 				return AvalonComponent.Lifestyle;
 			}
-		}
-
-		public String Name
+		}
+
+        public Apache.Avalon.Framework.Activation ActivationPolicy
+        {
+            get
+            {
+                if (AvalonComponent == null)
+                {
+                    return Apache.Avalon.Framework.Activation.Undefined;
+                }
+
+                return AvalonComponent.Activation;
+            }
+        }
+
+        public String Name
 		{
 			get
 			{