public void RegisterMessageHandlers(IEnumerable <Assembly> assemblies, IMessageHandlerConvention messageHandlerConvention) { Condition.Requires(assemblies, "assemblies").IsNotNull(); Condition.Requires(messageHandlerConvention, "messageHandlerLocator").IsNotNull(); foreach (Assembly assembly in assemblies) { InternalRegisterMessageHandlers(assembly, messageHandlerConvention); } SortRegisteredHandlers(); }
/// <summary> /// Start configuration of messages bus and scan for message handlers in the supplied assemblies. /// </summary> /// <param name="cfg"></param> /// <param name="assemblies"></param> /// <param name="messageHandlerConvention"></param> /// <returns></returns> public static MessageBusConfiguration MessageBus(this BaseConfiguration cfg, IEnumerable<Assembly> assemblies, IMessageHandlerConvention messageHandlerConvention = null) { if (cfg.ContainsKey(MessageBus_SettingsKey)) throw new InvalidOperationException("You should not configure MessageBus twice."); cfg.Set(MessageBus_SettingsKey, true); Condition.Requires(assemblies, "assemblies").IsNotNull(); // Also scan core message handlers assemblies = assemblies.Union(new Assembly[] { Assembly.GetExecutingAssembly() }); MessageDispatcher dispatcher = MessageBusConfigurationExtensions.GetDispatcher(cfg); dispatcher.RegisterMessageHandlers(assemblies, messageHandlerConvention ?? new DefaultMessageHandlerConvention()); return new MessageBusConfiguration(cfg); }
internal void InternalRegisterMessageHandlers(Assembly assembly, IMessageHandlerConvention messageHandlerConvention) { Condition.Requires(assembly, "assembly").IsNotNull(); Condition.Requires(messageHandlerConvention, "messageHandlerLocator").IsNotNull(); Logger.DebugFormat("Scanning assembly '{0}' for message handlers.", assembly); Logger.DebugFormat("Using message handler convention '{0}'.", messageHandlerConvention); // Go through all types and all their methods looking for message handlers foreach (Type handler in assembly.GetTypes()) { foreach (MethodInfo method in handler.GetMethods()) { // Only test single-parameter methods for handlers ParameterInfo[] parameters = method.GetParameters(); if (parameters.Length == 1) { Type baseType = parameters[0].ParameterType; if (messageHandlerConvention.IsMessageHandler(method, baseType)) { // Go through all other messages that inherit from the handlers message parameter foreach (Type messageType in GetAllInheritedClasses(baseType)) { Logger.DebugFormat("Register message handler '{0}' on '{1}' for message type '{2}'.", method.Name, method.DeclaringType, messageType); MessageHandlerRegistration registration = new MessageHandlerRegistration(messageType, method); MessageHandlers.Add(registration); if (!MessageHandlerIndex.ContainsKey(messageType)) { MessageHandlerIndex.Add(messageType, new List <MessageHandlerRegistration>()); } MessageHandlerIndex[messageType].Add(registration); if (!ObjectContainer.HasComponent(method.DeclaringType)) { ObjectContainer.AddComponent(method.DeclaringType, method.DeclaringType); } } } } } } }
public void RegisterMessageHandlers(Assembly assembly, IMessageHandlerConvention messageHandlerConvention) { InternalRegisterMessageHandlers(assembly, messageHandlerConvention); }
/// <summary> /// Start configuration of messages bus and scan for message handlers in the supplied assemblies. /// </summary> /// <param name="cfg"></param> /// <param name="assemblies"></param> /// <param name="messageHandlerConvention"></param> /// <returns></returns> public static MessageBusConfiguration MessageBus(this BaseConfiguration cfg, IEnumerable <Assembly> assemblies, IMessageHandlerConvention messageHandlerConvention = null) { if (cfg.ContainsKey(MessageBus_SettingsKey)) { throw new InvalidOperationException("You should not configure MessageBus twice."); } cfg.Set(MessageBus_SettingsKey, true); Condition.Requires(assemblies, "assemblies").IsNotNull(); // Also scan core message handlers assemblies = assemblies.Union(new Assembly[] { Assembly.GetExecutingAssembly() }); MessageDispatcher dispatcher = MessageBusConfigurationExtensions.GetDispatcher(cfg); dispatcher.RegisterMessageHandlers(assemblies, messageHandlerConvention ?? new DefaultMessageHandlerConvention()); return(new MessageBusConfiguration(cfg)); }