You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by ha...@apache.org on 2004/04/04 01:18:17 UTC
cvs commit: avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/Default DefaultHandler.cs DefaultHandlerFactory.cs SimpleHandler.cs SimpleHandlerFactory.cs
hammett 2004/04/03 15:18:17
Added: avalon-net/Castle/MicroKernel/Handler AbstractHandler.cs
HandlerException.cs IHandler.cs IHandlerFactory.cs
State.cs
avalon-net/Castle/MicroKernel/Handler/Default
DefaultHandler.cs DefaultHandlerFactory.cs
SimpleHandler.cs SimpleHandlerFactory.cs
Log:
MicroKernel for Avalon Castle - Improvements.
Revision Changes Path
1.1 avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/AbstractHandler.cs
Index: AbstractHandler.cs
===================================================================
// 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 Kernel 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="service"></param>
/// <param name="implementation"></param>
public AbstractHandler( IComponentModel model )
{
AssertUtil.ArgumentNotNull( model, "model" );
m_componentModel = model;
}
#region IHandler Members
public virtual void Init( Kernel kernel )
{
m_kernel = kernel;
}
public virtual object Resolve()
{
if (m_state == State.WaitingDependency)
{
throw new HandlerException("Can't Resolve component. It has dependencies to be satisfied.");
}
try
{
object instance = m_lifestyleManager.Resolve();
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 )
{
if (!HasInstance( instance, false ))
{
WeakReference reference = new WeakReference( instance );
m_instances.Add( reference );
}
}
protected virtual void UnregisterInstance( object instance )
{
if (m_instances.Count == 0)
{
return;
}
HasInstance( instance, true );
}
protected virtual bool HasInstance( object instance, bool removeIfFound )
{
foreach( WeakReference reference in m_instances )
{
if (reference.Target == null)
{
m_instances.Remove( reference );
}
if ( Object.ReferenceEquals( instance, reference.Target ) )
{
if (removeIfFound)
{
m_instances.Remove( reference );
}
return true;
}
}
return false;
}
}
}
1.1 avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/HandlerException.cs
Index: HandlerException.cs
===================================================================
// 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;
/// <summary>
/// Summary description for HandlerException.
/// </summary>
[Serializable]
public class HandlerException : System.Exception
{
public HandlerException( String message ) : base(message)
{
}
public HandlerException( String message, Exception ex ) : base(message, ex)
{
}
}
}
1.1 avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/IHandler.cs
Index: IHandler.cs
===================================================================
// 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;
/// <summary>
/// Summary description for IHandler.
/// </summary>
public interface IHandler : IResolver
{
/// <summary>
///
/// </summary>
/// <param name="kernel"></param>
void Init( Kernel kernel );
/// <summary>
///
/// </summary>
State ActualState
{
get;
}
/// <summary>
///
/// </summary>
/// <param name="instance"></param>
/// <returns></returns>
bool IsOwner( object instance );
}
}
1.1 avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/IHandlerFactory.cs
Index: IHandlerFactory.cs
===================================================================
// 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;
/// <summary>
/// Summary description for IHandlerFactory.
/// </summary>
public interface IHandlerFactory
{
IHandler CreateHandler( IComponentModel model );
}
}
1.1 avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/State.cs
Index: State.cs
===================================================================
// 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;
/// <summary>
/// Summary description for State.
/// </summary>
public enum State
{
/// <summary>
///
/// </summary>
Valid,
/// <summary>
///
/// </summary>
WaitingDependency
}
}
1.1 avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandler.cs
Index: DefaultHandler.cs
===================================================================
// 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.Default
{
using System;
using Apache.Avalon.Castle.MicroKernel.Model;
using Apache.Avalon.Castle.MicroKernel.Concerns;
using Apache.Avalon.Castle.MicroKernel.Factory.Default;
/// <summary>
/// Summary description for DefaultHandler.
/// </summary>
public class DefaultHandler : SimpleHandler
{
public DefaultHandler( IComponentModel model ) : base( model )
{
}
protected override void CreateComponentFactoryAndLifestyleManager()
{
IComponentFactory innerFactory = new Factory.Default.SimpleComponentFactory(
m_kernel.GetAspects(AspectPointCutFlags.Before),
m_kernel.GetAspects(AspectPointCutFlags.After),
m_componentModel, m_serv2handler);
if (m_kernel is AvalonKernel)
{
AvalonKernel kernel = (AvalonKernel) m_kernel;
IConcern commissionChain = kernel.Concerns.GetCommissionChain( kernel );
IConcern decommissionChain = kernel.Concerns.GetDecommissionChain( kernel );
ConcernChainComponentFactory factory =
new ConcernChainComponentFactory(
commissionChain, decommissionChain,
m_componentModel, innerFactory );
innerFactory = factory;
}
m_lifestyleManager =
m_kernel.LifestyleManagerFactory.Create(
innerFactory, m_componentModel );
}
}
}
1.1 avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/Default/DefaultHandlerFactory.cs
Index: DefaultHandlerFactory.cs
===================================================================
// 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.Default
{
using System;
using Apache.Avalon.Castle.MicroKernel.Model;
/// <summary>
/// Summary description for DefaultHandlerFactory.
/// </summary>
public class DefaultHandlerFactory : IHandlerFactory
{
public DefaultHandlerFactory()
{
}
#region IHandlerFactory Members
public virtual IHandler CreateHandler( IComponentModel model )
{
return new DefaultHandler( model );
}
#endregion
}
}
1.1 avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/Default/SimpleHandler.cs
Index: SimpleHandler.cs
===================================================================
// 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.Default
{
using System;
using System.Collections;
using System.Reflection;
using Apache.Avalon.Castle.MicroKernel.Model;
/// <summary>
/// Summary description for SimpleHandler.
/// </summary>
public class SimpleHandler : AbstractHandler
{
/// <summary>
///
/// </summary>
/// <param name="service"></param>
/// <param name="implementation"></param>
public SimpleHandler( IComponentModel model ) : base( model )
{
}
#region IHandler Members
public override void Init( Kernel kernel )
{
base.Init(kernel);
// Now we check with the kernel if
// we have the necessary implementations
// for the services requested by the constructor
EnsureDependenciesCanBeSatisfied();
CreateComponentFactoryAndLifestyleManager();
}
#endregion
protected virtual void EnsureDependenciesCanBeSatisfied()
{
foreach(IDependencyModel dependency in m_componentModel.Dependencies )
{
AddDependency( dependency.Service );
}
}
protected virtual void AddDependency( Type service )
{
if (m_kernel.HasService( service ))
{
m_serv2handler[ service ] = m_kernel.GetHandlerForService( service );
}
else
{
// This is handler is considered invalid
// until dependencies are satisfied
m_state = State.WaitingDependency;
m_dependencies.Add( service );
// Register ourself in the kernel
// to be notified if the dependency is satified
m_kernel.AddDependencyListener(
service,
new DependencyListenerDelegate(DependencySatisfied) );
}
}
/// <summary>
/// Delegate implementation invoked by kernel
/// when one of registered dependencies were satisfied by
/// new components registered.
/// </summary>
/// <param name="service"></param>
/// <param name="handler"></param>
private void DependencySatisfied( Type service, IHandler handler )
{
m_serv2handler[ service ] = handler;
m_dependencies.Remove( service );
if (m_dependencies.Count == 0)
{
m_state = State.Valid;
}
}
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(
factory, m_componentModel );
}
}
}
1.1 avalon-sandbox/avalon-net/Castle/MicroKernel/Handler/Default/SimpleHandlerFactory.cs
Index: SimpleHandlerFactory.cs
===================================================================
// 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.Default
{
using System;
using Apache.Avalon.Castle.MicroKernel.Model;
/// <summary>
/// Summary description for SimpleHandlerFactory.
/// </summary>
public class SimpleHandlerFactory : IHandlerFactory
{
public SimpleHandlerFactory()
{
}
#region IHandlerFactory Members
public virtual IHandler CreateHandler( IComponentModel model )
{
return new SimpleHandler( model );
}
#endregion
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org