Esempio n. 1
0
        /// <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);
        }
Esempio n. 3
0
        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());
        }
Esempio n. 4
0
        /// <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>();
        }