Exemplo n.º 1
0
        /// <summary>
        /// Handels a <see cref="IRequest"/>
        /// </summary>
        /// <param name="request">A <see cref="IRequest"/> instance containing information about the current request</param>
        /// <returns>A <see cref="IResponse"/> instance containing information about the response</returns>
        public IResponse HandleRequest(IRequest request)
        {
            //TODO:Refactor this method. To much is going on here.
            request.ArgumentNullCheck("request");

            request = prePipelineCollection.Execute(request);

            using (var nestedContainer = serviceContainer.GetNestedContainer())
            {
                nestedContainer.Set(request);

                //TODO:Figure out better way to do this. We need to access the session each request to renew the cookie.
                nestedContainer.Resolve<ISession>();
                nestedContainer.Set(nestedContainer);
                nestedContainer.Set<IResolveDependencies>(nestedContainer);

                //TODO:Find better way to do this. Should probably be a backgound job.
                nestedContainer.Resolve<ISessionIdProvider>().ClearInactiveKeys();

                var route = collection.Resolve(request);

                nestedContainer.Set(route);

                var outputWriter = nestedContainer.Resolve<IOutputWriter>();

                if (route == null)
                {
                    outputWriter.WriteStatusCode(HttpStatusCode.NotFound);
                    return outputWriter.CreateResponse();
                }

                nestedContainer.Set(route.Endpoint);
                nestedContainer.ConfigureEndpointExecutor(route.Endpoint);

                var chain = requestGraph.FindChainFor(route.Endpoint);

                var requestTasks = nestedContainer.ResolveAll<IExecutePerRequest>().ToList();
                ExecutePerRequestTasks(requestTasks);

                chain.Execute(nestedContainer, request);

                DisposePerRequestTasks(requestTasks);

                return postPipelineCollection.Execute(outputWriter.CreateResponse());
            }
        }