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.

Reply via email to