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]