private static void UseControllerlessApiDocumentation(HttpConfiguration config)
        {
            var queryApiExplorer = new ControllerlessApiExplorer(
                messageTypes: Bootstrapper.GetKnownQueryTypes().Select(t => t.QueryType),
                responseTypeSelector: type => BusinessLayerBootstrapper.GetQueryResultType(type))
            {
                ControllerName          = "queries",
                ParameterSourceSelector = type => ApiParameterSource.FromUri,
                HttpMethodSelector      = type => HttpMethod.Get,
                ActionNameSelector      = type => type.ToFriendlyName()
            };

            var commandApiExplorer = new ControllerlessApiExplorer(
                messageTypes: Bootstrapper.GetKnownCommandTypes(),
                responseTypeSelector: type => typeof(void))
            {
                ControllerName     = "commands",
                ParameterName      = "command",
                ActionNameSelector = type => type.ToFriendlyName(),
            };

            config.Services.Replace(typeof(IApiExplorer),
                                    new CompositeApiExplorer(
                                        config.Services.GetApiExplorer(),
                                        commandApiExplorer,
                                        queryApiExplorer));
        }
        private static void UseControllerlessApiDocumentation(HttpConfiguration config)
        {
            var queryApiExplorer = new ControllerlessApiExplorer(
                messageTypes: Bootstrapper.GetKnownQueryTypes().Select(t => t.QueryType),
                responseTypeSelector: type => new QueryInfo(type).ResultType)
            {
                ControllerName = "queries",
                ParameterSourceSelector = type => ApiParameterSource.FromUri,
                HttpMethodSelector = type => HttpMethod.Get,
                ActionNameSelector = type => type.Name.Replace("Query", string.Empty)
            };

            var commandApiExplorer = new ControllerlessApiExplorer(
                messageTypes: Bootstrapper.GetKnownCommandTypes(),
                responseTypeSelector: type => typeof(void))
            {
                ControllerName = "commands",
                ParameterName = "command",
                ActionNameSelector = type => type.Name.Replace("Command", string.Empty),
            };

            config.Services.Replace(typeof(IApiExplorer),
                new CompositeApiExplorer(
                    config.Services.GetApiExplorer(),
                    commandApiExplorer,
                    queryApiExplorer));
        }
        private static void UseControllerlessApiDocumentation(HttpConfiguration config, ILifetimeScope lifetimeScope)
        {
            using (var scope = lifetimeScope.BeginLifetimeScope())
            {
                var routeMapper = scope.Resolve <ResponsibilityChain <Type, IEnumerable <string> > >();

                var commandApiExplorer =
                    new ControllerlessApiExplorer(
                        messageTypes: GetKnownCommandTypes(lifetimeScope),
                        responseTypeSelector: type => typeof(void))
                {
                    ApiPrefix          = string.Empty,
                    ControllerName     = "commands",
                    ParameterName      = "command",
                    ActionNameSelector = commandType => routeMapper.Handle(commandType).First(),
                };

                var queryApiExplorer = new ControllerlessApiExplorer(
                    messageTypes: GetKnownQueryTypes(lifetimeScope),
                    responseTypeSelector: DetermineResultTypes)
                {
                    ApiPrefix               = string.Empty,
                    ControllerName          = "queries",
                    ParameterSourceSelector = type => ApiParameterSource.FromUri,
                    HttpMethodSelector      = type => HttpMethod.Get,
                    ActionNameSelector      = queryType => routeMapper.Handle(queryType).First(),
                };

                config.Services.Replace(
                    typeof(IApiExplorer),
                    new CompositeApiExplorer(
                        config.Services.GetApiExplorer(),
                        commandApiExplorer,
                        queryApiExplorer
                        )
                    );
            }
        }