///<summary> /// Registers all services needed to use RequestHandlers.Mvc /// This method implicitly adds Mvc as it is needed by RequestHandlers.Mvc ///</summary> public static IServiceCollection AddRequestHandlers(this IServiceCollection services, params Assembly[] assemblies) { // Services used by RequestHandlers.Mvc services.AddTransient <IWebRequestProcessor, DefaultWebRequestProcessor>(); services.AddTransient <IRequestDispatcher, DefaultRequestDispacher>(); services.AddTransient <IRequestHandlerResolver>(x => new DefaultRequestHandlerResolver(x)); // Helper to create the generic interfaces var requestHandlerInterface = typeof(IRequestHandler <,>); // Get all RequestHandlerDefinitions from the given assemblies var requestHandlerDefinitions = RequestHandlerFinder.InAssembly(assemblies); // Register them as services foreach (var requestHandler in requestHandlerDefinitions) { services.Add(new ServiceDescriptor(requestHandlerInterface.MakeGenericType(requestHandler.RequestType, requestHandler.ResponseType), requestHandler.RequestHandlerType, ServiceLifetime.Transient)); } // Add them to Mvc so they can be used as controllers services .AddMvc() .AddApplicationPart(RequestHandlerControllerBuilder.Build(requestHandlerDefinitions)); return(services); }
public void Execute(List <string> inputPaths, string outputPath) { var assemblies = LoadAssembliesHelper.Load(inputPaths); var requestHandlerDefinitions = RequestHandlerFinder.InAssembly(assemblies); var definitions = requestHandlerDefinitions.SelectMany(x => x.RequestType.GetTypeInfo() .GetCustomAttributes <HttpRequestAttribute>(true), (definition, attribute) => new HttpRequestHandlerDefinition(attribute, definition)).ToArray(); var files = new GenerateTypescript().GenerateContractsForRequests(definitions).Concat(new[] { new KeyValuePair <string, string>("common.ts", @"import {Observable} from 'rxjs/Observable'; export interface IRequestDispatcher { execute<TResponse>(request: HttpRequest<TResponse>): Observable<TResponse>; } export interface HttpRequest<TResponse> { route: string; queryString?: {[key: string]: string}, body?: any, method: string; } ") }); new SyncFiles().DoSync(outputPath, files); }
public void Configuration(IAppBuilder app) { var builder = new Autofac.ContainerBuilder(); builder.RegisterType <DefaultRequestDispacher>().As <IRequestDispatcher>(); builder.RegisterType <RequestHandlerResolver>().As <IRequestHandlerResolver>(); builder.RegisterType <DefaultWebApiRequestProcessor>().As <IWebApiRequestProcessor>(); var requestHandlerInterface = typeof(IRequestHandler <,>); var requestHandlerDefinitions = RequestHandlerFinder.InAssembly(this.GetType().GetTypeInfo().Assembly); foreach (var requestHandler in requestHandlerDefinitions) { builder.RegisterType(requestHandler.RequestHandlerType) .As(requestHandlerInterface.MakeGenericType(requestHandler.RequestType, requestHandler.ResponseType)); } var config = new HttpConfiguration(); var generated = config.ConfigureRequestHandlers(requestHandlerDefinitions); builder.RegisterApiControllers(generated); var container = builder.Build(); config.DependencyResolver = new AutofacWebApiDependencyResolver(container); // Register the Autofac middleware FIRST, then the Autofac Web API middleware, // and finally the standard Web API middleware. config.MapHttpAttributeRoutes(); app.UseAutofacMiddleware(container); app.UseAutofacWebApi(config); app.UseWebApi(config); config.EnableSwagger(c => { c.SingleApiVersion("v1", "RequestHandlers.TestHost"); }) .EnableSwaggerUi(c => { }); }