/// <summary>
        /// If event's is from assemblies not listed here, it means that it comes from server.
        /// </summary>
        /// <param name="assembly"></param>
        public void Discover(IEnumerable <Type> types)
        {
            var appTypes = types
                           .Where(x => typeof(IAppProcess).IsAssignableFrom(x) && !x.IsAbstract)
                           .ToArray();

            foreach (var appType in appTypes)
            {
                AppProcessSchema item = Discover(appType, types.Select(x => x.Assembly).Distinct().ToArray());
                _items.Add(item);
            }
        }
        private AppProcessSchema Discover(Type appType, Assembly[] assemblies)
        {
            AppProcessSchema schema = new AppProcessSchema(appType, ServiceConventions.GetCategoryFromNamespace(appType.Namespace));
            var methods             = appType.GetMethods(DEFAULT_FLAGS)
                                      .Where(x => x.Name == "When")
                                      .ToArray();

            foreach (var m in methods)
            {
                var args = m.GetParameters();
                if (args.Length == 1)
                {
                    ReactionSource source;
                    ReactionReason reason;
                    var            pType = args[0].ParameterType;
                    if (typeof(ICommand).IsAssignableFrom(pType))
                    {
                        reason = ReactionReason.Command;
                    }
                    else if (typeof(IEvent).IsAssignableFrom(pType))
                    {
                        reason = ReactionReason.Event;
                    }
                    else
                    {
                        reason = ReactionReason.Custom;
                    };

                    //if (assemblies.Any(x => x == pType.Assembly))
                    if (appType.Assembly == pType.Assembly)
                    {
                        source = ReactionSource.UiOnly;
                    }
                    else
                    {
                        source = ReactionSource.Server;
                    }
                    schema.AddReaction(reason, source, pType);
                }
                else if (args.Length == 2)
                {
                    ReactionSource source;
                    ReactionReason reason;
                    var            pType = args[1].ParameterType;
                    if (typeof(ICommand).IsAssignableFrom(pType))
                    {
                        reason = ReactionReason.Command;
                    }
                    else if (typeof(IEvent).IsAssignableFrom(pType))
                    {
                        reason = ReactionReason.Event;
                    }
                    else
                    {
                        reason = ReactionReason.Custom;
                    }

                    //if (assemblies.Any(x => x == pType.Assembly))
                    if (appType.Assembly == pType.Assembly)
                    {
                        source = ReactionSource.UiOnly;
                    }
                    else
                    {
                        source = ReactionSource.Server;
                    }
                    schema.AddReaction(reason, source, pType);
                }
            }

            return(schema);
        }