using System.Collections.Generic; using System.Reflection; using Caliburn.Events.Brokering; using Castle.Core; using Castle.MicroKernel.Facilities; namespace Caliburn.Castle { public class EventRegistrationFacility : AbstractFacility { private IEventBroker _eventBroker; protected override void Init() { Kernel.AddComponent("IEventBroker", typeof(IEventBroker), typeof(EventBroker)); _eventBroker = (IEventBroker) Kernel.Resolve(typeof(IEventBroker)); Kernel.ComponentModelBuilder.AddContributor(new EventPublicationContributer(_eventBroker)); Kernel.ComponentModelBuilder.AddContributor(new EventSubscriptionContributer(_eventBroker)); Kernel.ComponentCreated += Kernel_ComponentCreated; } private void Kernel_ComponentCreated(ComponentModel model, object instance) { HandlePublishers(instance, model); HandleSubscribers(instance, model); } private void HandleSubscribers(object instance, ComponentModel model) { IDictionary subscribedMethods = (IDictionary) model.ExtendedProperties[EventSubscriptionContributer.SubcsribedMethods]; foreach(KeyValuePair subscribedMethod in subscribedMethods) { _eventBroker.Subscribe( subscribedMethod.Key.EventNodeName, new Subscription(instance, subscribedMethod.Value, subscribedMethod.Key.IsAsync) ); } } private void HandlePublishers(object instance, ComponentModel model) { IDictionary publishedEvents = (IDictionary) model.ExtendedProperties[EventPublicationContributer.PublishedEvents]; foreach(KeyValuePair publishedEvent in publishedEvents) { _eventBroker.Publish( instance, publishedEvent.Value, publishedEvent.Key.BuildPublication() ); } } } }