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 at http://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.
