You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avalon.apache.org by hammett <ha...@uol.com.br> on 2003/09/15 05:06:25 UTC
[Avalon.Net] Dependencies and extensions
I've been playing around with Avalon.Net this sunday and implemented (for
the simplest case)
- dependencies handling
- extensions
As my first intention, I centralized lifecycle handling in a common class.
This class expose events to anyone who wants to participate someway. That
has been said, I must tell you that was particulary easy to code a
PicoContainer style of dependency setting:
Begin PicoContainerExtension.cs
namespace Apache.Avalon.Container.Test.Module
{
using System;
using System.Reflection;
using Apache.Avalon.Container.Extension;
public class PicoContainerExtension : IExtensionModule
{
public PicoContainerExtension()
{
}
#region IExtensionModule Members
public void Init(LifecycleManager manager)
{
manager.SetupDependencies += new LifecycleHandler(OnSetupDependencies);
}
#endregion
private void OnSetupDependencies(LifecycleEventArgs e)
{
object instance = e.Component;
MethodInfo method = instance.GetType().GetMethod("set_" +
e.DependencyKey,
BindingFlags.SetProperty|BindingFlags.Public|BindingFlags.Instance);
if (method != null)
{
method.Invoke(instance, new object[] { e.DependencyInstance } );
}
}
}
}
End PicoContainerExtension.cs
Follows Vehicle.cs:
namespace Apache.Avalon.Container.Test.Components
{
using System;
using NUnit.Framework;
using Apache.Avalon.Framework;
public interface IVehicle
{
IEngine Engine
{
get;
set;
}
IRadio Radio
{
get;
set;
}
}
public interface IEngine
{
void TurnOn();
void TurnOff();
}
public interface IRadio
{
}
[AvalonService( typeof(IVehicle) )]
[AvalonComponent( "Vehicle", Lifestyle.Transient )]
[AvalonDependency( typeof(IEngine), "Engine", Optional.False)]
[AvalonDependency( typeof(IRadio), "Radio", Optional.False)]
public class Vehicle : IVehicle, ILookupEnabled
{
private IEngine m_engine;
private IRadio m_radio;
public IEngine Engine
{
get
{
return m_engine;
}
set
{
m_engine = value;
}
}
public IRadio Radio
{
get
{
return m_radio;
}
set
{
m_radio = value;
}
}
#region ILookupEnabled Members
public void EnableLookups(ILookupManager manager)
{
Assertion.AssertNotNull(manager);
Assertion.AssertNotNull(manager["Engine"]);
Assertion.AssertNotNull(manager["Radio"]);
Assertion.Equals( typeof(IEngine), manager["Engine"].GetType() );
Assertion.Equals( typeof(IRadio), manager["Radio"].GetType() );
}
#endregion
}
[AvalonService( typeof(IEngine) )]
[AvalonComponent( "Engine", Lifestyle.Transient )]
public class Engine : IEngine
{
#region IEngine Members
public void TurnOn()
{
}
public void TurnOff()
{
}
#endregion
}
[AvalonService( typeof(IRadio) )]
[AvalonComponent( "Radio", Lifestyle.Transient )]
public class Radio : IRadio
{
}
}
There are other assumptions I've made that are very different from Fortress,
but let's discuss it in the next days.
Regards
hammett
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@avalon.apache.org
For additional commands, e-mail: dev-help@avalon.apache.org