short and sweat!
public class EventBrokerContributor :
IContributeComponentModelConstruction
{
public void ProcessModel(IKernel kernel, ComponentModel model)
{
if (model.ImplementationIsAListener() == false) return;
var steps = model.LifecycleSteps;
var broker = kernel.Resolve<IEventRegister>();
steps.Add(LifecycleStepType.Commission, new
RegisterWithEventBroker(broker));
steps.Add(LifecycleStepType.Decommission, new
UnregisterWithEventBroker(broker));
}
}
public class RegisterWithEventBroker : ILifecycleConcern
{
private readonly IEventRegister broker;
public RegisterWithEventBroker(IEventRegister broker)
{
this.broker = broker;
}
public void Apply(ComponentModel model, object component)
{
broker.Register(component);
}
}
public class UnregisterWithEventBroker : ILifecycleConcern
{
private readonly IEventRegister broker;
public UnregisterWithEventBroker(IEventRegister broker)
{
this.broker = broker;
}
public void Apply(ComponentModel model, object component)
{
broker.Unregister(component);
}
}
On Oct 5, 8:15 am, Krzysztof Koźmic <[email protected]>
wrote:
> No worries. Actually I was thinking - this might serve as a good basis
> for a sample app showing Windsor's extensibility. Would you be
> interested in putting together a small sample app built on top of that
> facility and submitting it as a sample for Windsor?
>
> Pretty much like the other sample we have for
> Silverlight:http://github.com/HEskandari/Castle-Windsor-Examples
>
> cheers,
> Krzysztof
>
> On 5/10/2010 10:05 PM, Jason Meckley wrote:
>
> > thank you. I'll research that this morning.
>
> > On Oct 4, 6:24 pm, Krzysztof Koźmic<[email protected]>
> > wrote:
> >> Looks good although custom Activator swapped under the covers feels too
> >> intrusive. I'd use lifestyle concerns instead.
>
> >> sent from my HTC Desire
>
> >> On 05/10/2010 6:07 AM, "Jason Meckley"<[email protected]> wrote:
>
> >> I'm spiking a sample of an event broker where listeners are
> >> (un)registered to the broker during resolution/destruction. the code
> >> below appears to be working, but I wanted to double check with the
> >> community to make sure I'm not missing something obvious (or not so
> >> obvious).
>
> >> public class EventBrokerFacility
> >> : AbstractFacility
> >> {
> >> protected override void Init()
> >> {
> >> Kernel.ComponentModelBuilder.AddContributor(new
> >> EventBrokerContributor());
> >> Kernel.Register(Component
>
> >> .For<SynchronizationContext>()
>
> >> .ImplementedBy<WindowsFormsSynchronizationContext>()
> >>
> >> .LifeStyle.Singleton,
> >> Component
> >>
> >> .For<IEventPublisher,
> >> IEventRegister>()
>
> >> .ImplementedBy<EventBroker>()
>
> >> .LifeStyle.Singleton);
> >> }}
>
> >> public class EventBrokerContributor
> >> : IContributeComponentModelConstruction
> >> {
> >> private readonly Type activator = typeof
> >> (EventBrokerComponentActivator);
> >> private readonly Type listener = typeof (IListener<>);
>
> >> public void ProcessModel(IKernel kernel, ComponentModel model)
> >> {
> >> var isAListener = model
> >> .Implementation
> >> .GetInterfaces()
> >> .Where(i => i.IsGenericType)
> >> .Select(i => i.GetGenericTypeDefinition())
> >> .Any(i => i == listener);
>
> >> if (isAListener == false) return;
> >> model.CustomComponentActivator = activator;
> >> }}
>
> >> public class EventBrokerComponentActivator
> >> : DefaultComponentActivator
> >> {
> >> private IEventRegister Broker
> >> {
> >> get { return Kernel.Resolve<IEventRegister>(); }
> >> }
>
> >> public EventBrokerComponentActivator(
> >> ComponentModel model,
> >> IKernel kernel,
> >> ComponentInstanceDelegate onCreation,
> >> ComponentInstanceDelegate onDestruction)
> >> : base(model, kernel, onCreation, onDestruction)
> >> {
> >> }
>
> >> public override object Create(CreationContext context)
> >> {
> >> var component = base.Create(context);
> >> Broker.Register(component);
> >> return component;
> >> }
>
> >> public override void Destroy(object instance)
> >> {
> >> Broker.Unregister(instance);
> >> base.Destroy(instance);
> >> }
>
> >> }
>
> >> as an example this class will use the EventBrokerComponentActivator
> >> class Presenter : IListener<Foo>,IListener<Bar>
> >> {
>
> >> }
>
> >> while this class uses the default.
> >> class Service
> >> {
>
> >> }
>
> >> --
> >> You received this message because you are subscribed to the Google Groups
> >> "Castle Project Users" group.
> >> To post to this group, send email to [email protected].
> >> To unsubscribe from this group, send email to
> >> [email protected]<castle-project-users%[email protected]>
> >> .
> >> For more options, visit this group
> >> athttp://groups.google.com/group/castle-project-users?hl=en.
>
>
--
You received this message because you are subscribed to the Google Groups
"Castle Project Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/castle-project-users?hl=en.