/// <summary> /// NSwag for swagger /// </summary> /// <param name="services"></param> public static void SetupNSwag(this IServiceCollection services) { // Register the Swagger services services.AddOpenApiDocument((options, serviceProvider) => { options.DocumentName = "v1"; options.Title = "Clean Architecture Cosmos DB API"; options.Version = "v1"; FluentValidationSchemaProcessor fluentValidationSchemaProcessor = serviceProvider.GetService <FluentValidationSchemaProcessor>(); // Add the fluent validations schema processor options.SchemaProcessors.Add(fluentValidationSchemaProcessor); // Add JWT token authorization options.OperationProcessors.Add(new OperationSecurityScopeProcessor("auth")); options.DocumentProcessors.Add(new SecurityDefinitionAppender("auth", new OpenApiSecurityScheme { Type = OpenApiSecuritySchemeType.Http, In = OpenApiSecurityApiKeyLocation.Header, Scheme = "bearer", BearerFormat = "jwt" })); }); // Add the FluentValidationSchemaProcessor as a singleton services.AddSingleton <FluentValidationSchemaProcessor>(); }
private JsonSchemaGeneratorSettings CreateJsonSchemaGeneratorSettings() { var testValidator = new MockValidationTargetValidator(); var validatorFactoryMock = new Mock <IValidatorFactory>(); validatorFactoryMock.Setup(x => x.GetValidator(It.IsAny <Type>())).Returns(testValidator); var validatorFactory = validatorFactoryMock.Object; var fluentValidationSchemaProcessor = new FluentValidationSchemaProcessor(validatorFactory); var jsonSchemaGeneratorSettings = new JsonSchemaGeneratorSettings(); jsonSchemaGeneratorSettings.SchemaProcessors.Add(fluentValidationSchemaProcessor); return(jsonSchemaGeneratorSettings); }
public static void Generate(string assembly, string @namespace, string output) { var dir = Directory.GetCurrentDirectory(); var loader = PluginLoader.CreateFromAssemblyFile(assembly); var defaultAssembly = loader.LoadDefaultAssembly(); var messages = from t in defaultAssembly.GetTypes() where t.IsClass || t.IsValueType where !t.IsPrimitive && !string.IsNullOrEmpty(t.Namespace) where t.Namespace.StartsWith(@namespace) let attributes = t.GetCustomAttributes(typeof(DataContractAttribute), true) where attributes != null && attributes.Length > 0 select t; var validatorFactory = new ValidatorFactory(defaultAssembly); var schemaProcessor = new FluentValidationSchemaProcessor(validatorFactory); var settings = new JsonSchemaGeneratorSettings(); settings.SchemaProcessors.Add(schemaProcessor); settings.DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; var schema = new JsonSchema(); // the schema to write into var resolver = new JsonSchemaResolver(schema, settings); // used to add and retrieve schemas from the 'definitions' var generator = new JsonSchemaGenerator(settings); var tsSettings = new TypeScriptGeneratorSettings { TypeStyle = TypeScriptTypeStyle.Class, TypeScriptVersion = 3.7m, }; Directory.CreateDirectory(output); var mainModule = ""; foreach (var type in messages) { var schemaForType = generator.Generate(type, resolver); schemaForType.Title = type.Name; var codeGenerator = new TypeScriptGenerator(schemaForType, tsSettings); var code = codeGenerator.GenerateFile(); using (var sourceFile = File.Open($"{output}/{type.Name}.ts", FileMode.Create)) { sourceFile.Write(Encoding.UTF8.GetBytes(code)); sourceFile.Flush(); } mainModule += $"export * from './{type.Name}'\n"; } using (var mainFile = File.Open($"{output}/index.ts", FileMode.Create)) { mainFile.Write(Encoding.UTF8.GetBytes(mainModule)); mainFile.Flush(); } Console.WriteLine(schema.ToJson()); }
/// <summary> /// This method gets called by the runtime. Use this method to add services to the container. /// </summary> /// <param name="services"></param> public void ConfigureServices(IServiceCollection services) { // HttpContextServiceProviderValidatorFactory requires access to HttpContext services.AddHttpContextAccessor(); // AutoMapper, this will scan and register everything that inherits AutoMapper.Profile services.AddAutoMapper(Assembly.GetExecutingAssembly()); // MediatR, this will scan and register everything that inherits IRequest, IPipelineBehavior services.AddMediatR(Assembly.GetExecutingAssembly()); services.AddTransient(typeof(IPipelineBehavior <,>), typeof(Infrastructure.Behaviours.ValidationBehaviour <,>)); services.AddTransient(typeof(IPipelineBehavior <,>), typeof(Infrastructure.ApiExceptions.UnhandledExceptionBehaviour <,>)); // Fluent Validation, this will scan and register everything that inherits FluentValidation.AbstractValidator //services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly()); // Bind database-related bindings CosmosDbSettings cosmosDbConfig = Configuration.GetSection("ConnectionStrings:CleanArchitectureCosmosDB").Get <CosmosDbSettings>(); // register CosmosDB client and data repositories services.AddCosmosDb(cosmosDbConfig.EndpointUrl, cosmosDbConfig.PrimaryKey, cosmosDbConfig.DatabaseName, cosmosDbConfig.Containers); services.AddScoped <IToDoItemRepository, ToDoItemRepository>(); // Non-distributed in-memory cache services services.AddMemoryCache(); services.AddScoped <ICachedToDoItemsService, InMemoryCachedToDoItemsService>(); services.AddScoped <IAuditRepository, AuditRepository>(); // API controllers services.AddControllers(options => // handle exceptions thrown by an action options.Filters.Add(new ApiExceptionFilterAttribute())) .AddNewtonsoftJson(options => { // Serilize enum in string options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); }) .AddFluentValidation(options => { // In order to register FluentValidation to define Swagger schema // https://github.com/RicoSuter/NSwag/issues/1722#issuecomment-544202504 // https://github.com/zymlabs/nswag-fluentvalidation options.RegisterValidatorsFromAssemblyContaining <Startup>(); // Optionally set validator factory if you have problems with scope resolve inside validators. options.ValidatorFactoryType = typeof(HttpContextServiceProviderValidatorFactory); }) .AddMvcOptions(options => { // Clear the default MVC model validations, as we are registering all model validators using FluentValidation // https://github.com/jasontaylordev/NorthwindTraders/issues/76 options.ModelMetadataDetailsProviders.Clear(); options.ModelValidatorProviders.Clear(); }); // NSwag Swagger // Add the FluentValidationSchemaProcessor as a singleton services.AddSingleton <FluentValidationSchemaProcessor>(); services.AddOpenApiDocument((options, serviceProvider) => { options.DocumentName = "v1"; options.Title = "Clean Architecture Cosmos DB API"; options.Version = "v1"; FluentValidationSchemaProcessor fluentValidationSchemaProcessor = serviceProvider.GetService <FluentValidationSchemaProcessor>(); // Add the fluent validations schema processor options.SchemaProcessors.Add(fluentValidationSchemaProcessor); }); // OData Support services.AddOData(); // In order to make swagger work with OData services.AddMvcCore(options => { foreach (OutputFormatter outputFormatter in options.OutputFormatters.OfType <OutputFormatter>().Where(x => x.SupportedMediaTypes.Count == 0)) { outputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/prs.odatatestxx-odata")); } foreach (InputFormatter inputFormatter in options.InputFormatters.OfType <InputFormatter>().Where(x => x.SupportedMediaTypes.Count == 0)) { inputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/prs.odatatestxx-odata")); } }); // Storage StorageFactory.Modules.UseAzureBlobStorage(); // Register IBlobStorage, which is used in AzureBlobStorageService // Avoid using IBlobStorage directly outside of AzureBlobStorageService. services.AddScoped <Storage.Net.Blobs.IBlobStorage>( factory => StorageFactory.Blobs.FromConnectionString(Configuration.GetConnectionString("StorageConnectionString"))); services.AddScoped <IStorageService, AzureBlobStorageService>(); }