private void RegisterHandlers(HandlerConfig config)
        {
            // Register traditional Brighter event type with appropriate handler and mapper.
            config.Register <TaskReminderSentEvent, TaskReminderSentEventHandler, TaskReminderSentEventMapper>();

            // Register events deriving from GenericTask that optonally confirm to our generic usage
            // hoisting custom version for derived types where found.
            RegisterGenericHandlersFor <GenericTask>(config);

            _container.Register(typeof(LoggingContextHandler <>)).AsMultiInstance();
        }
        private void RegisterGenericHandlersFor <TRequestBase>(HandlerConfig config)
        {
            var baseType = typeof(TRequestBase);

            foreach (var derivedType in EventTypes.Where(t => t.FullName != baseType.FullName && baseType.IsAssignableFrom(t)))
            {
                var handlerImplType = HandlerTypes.FirstOrDefault(t => typeof(IHandleRequests <>).MakeGenericType(derivedType).IsAssignableFrom(t));

                if (handlerImplType == null)
                {
                    var handlerBaseImplType = HandlerTypes.FirstOrDefault(t => t.Name.Equals(baseType.Name + "GenericHandler`1"));

                    if (handlerBaseImplType != null)
                    {
                        handlerImplType = handlerBaseImplType.MakeGenericType(derivedType);
                    }
                }

                var mapperImplType = MapperTypes.FirstOrDefault(t => typeof(IAmAMessageMapper <>).MakeGenericType(derivedType).IsAssignableFrom(t));

                if (mapperImplType == null)
                {
                    var mapperBaseImplType = MapperTypes.FirstOrDefault(t => t.Name.Equals(baseType.Name + "GenericMapper`1"));

                    if (mapperBaseImplType != null)
                    {
                        mapperImplType = mapperBaseImplType.MakeGenericType(derivedType);
                    }
                }

                config.Register(
                    type: derivedType,
                    handler: handlerImplType ?? typeof(GenericHandler <>).MakeGenericType(derivedType),
                    mapper: mapperImplType ?? typeof(GenericMapper <>).MakeGenericType(derivedType));
            }
        }