/// <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()); } }