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
{