コード例 #1
0
    public static void AddServices(this WebApplicationBuilder webApplicationBuilder)
    {
        var executingAssembly = Assembly.GetExecutingAssembly();

        webApplicationBuilder.Services.AddAutoMapper(executingAssembly);
        webApplicationBuilder.Services.AddScoped <InstanceContext>();

        foreach (var type in typeof(IMarkerForEdFiOdsAdminAppManagement).Assembly.GetTypes())
        {
            if (type.IsClass && !type.IsAbstract && (type.IsPublic || type.IsNestedPublic))
            {
                var concreteClass = type;

                if (concreteClass == typeof(OdsApiFacade))
                {
                    continue; //IOdsApiFacade is never resolved. Instead, classes inject IOdsApiFacadeFactory.
                }
                if (concreteClass == typeof(OdsRestClient))
                {
                    continue; //IOdsRestClient is never resolved. Instead, classes inject IOdsRestClientFactory.
                }
                if (concreteClass == typeof(TokenRetriever))
                {
                    continue; //ITokenRetriever is never resolved. Instead, other dependencies construct TokenRetriever directly.
                }
                var interfaces = concreteClass.GetInterfaces().ToArray();

                if (concreteClass.Namespace != null)
                {
                    if (concreteClass.Namespace.EndsWith("Database.Commands") || concreteClass.Namespace.EndsWith("Database.Queries"))
                    {
                        if (interfaces.Length == 1)
                        {
                            var serviceType = interfaces.Single();
                            if (serviceType.FullName == $"{concreteClass.Namespace}.I{concreteClass.Name}")
                            {
                                webApplicationBuilder.Services.AddTransient(serviceType, concreteClass);
                            }
                        }
                        else if (interfaces.Length == 0)
                        {
                            if (concreteClass.Name.EndsWith("Command") || concreteClass.Name.EndsWith("Query"))
                            {
                                webApplicationBuilder.Services.AddTransient(concreteClass);
                            }
                        }
                    }
                }
            }
        }

        // Add services to the container.
        // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
        webApplicationBuilder.Services.AddEndpointsApiExplorer();
        var issuer = webApplicationBuilder.Configuration.GetValue <string>("Authentication:IssuerUrl");

        webApplicationBuilder.Services.AddSwaggerGen(opt =>
        {
            opt.CustomSchemaIds(x => x.FullName);
            opt.OperationFilter <TokenEndpointBodyDescriptionFilter>();
            opt.AddSecurityDefinition(
                "oauth",
                new OpenApiSecurityScheme
            {
                Flows = new OpenApiOAuthFlows
                {
                    ClientCredentials = new OpenApiOAuthFlow
                    {
                        TokenUrl = new Uri($"{issuer}{SecurityConstants.TokenEndpointUri}"),
                        Scopes   = new Dictionary <string, string>
                        {
                            { SecurityConstants.Scopes.AdminApiFullAccess, "Unrestricted access to all Admin API endpoints" },
                        }
                    },
                },
                In   = ParameterLocation.Header,
                Name = HeaderNames.Authorization,
                Type = SecuritySchemeType.OAuth2
            }
                );
            opt.AddSecurityRequirement(
                new OpenApiSecurityRequirement
            {
                {
                    new OpenApiSecurityScheme
                    {
                        Reference = new OpenApiReference
                        {
                            Type = ReferenceType.SecurityScheme, Id = "oauth"
                        },
                    },
                    new[] { "api" }
                }
            }
                );

            opt.SwaggerDoc("v1", new OpenApiInfo
            {
                Title = "Admin API Documentation", Version = "v1"
            });
            opt.DocumentFilter <OperationResponsesDocumentFilter>();
            opt.DocumentFilter <RemoveSchemaDocumentFilter>();
            opt.DocumentFilter <AddRegisterSchemaDocumentFilter>();
            opt.OperationFilter <OperationDescriptionFilter>();
            opt.SchemaFilter <SwaggerRequiredSchemaFilter>();
            opt.CustomSchemaIds(x =>
            {
                var customSchemaName = x.GetCustomAttributes <DisplaySchemaNameAttribute>().SingleOrDefault();
                return(customSchemaName != null ? customSchemaName.Name : x.FullName);
            });
            opt.EnableAnnotations();
            opt.OrderActionsBy(x =>
            {
                return(x.HttpMethod != null ? x.HttpMethod.Equals("GET", StringComparison.InvariantCultureIgnoreCase) ? "0"
                    : x.HttpMethod.Equals("POST", StringComparison.InvariantCultureIgnoreCase) ? "1"
                    : x.HttpMethod.Equals("PUT", StringComparison.InvariantCultureIgnoreCase) ? "2"
                    : x.HttpMethod.Equals("DELETE", StringComparison.InvariantCultureIgnoreCase) ? "3" : "4" : "5");
            });
        });

        // Logging
        var loggingOptions = webApplicationBuilder.Configuration.GetSection("Log4NetCore").Get <Log4NetProviderOptions>();

        webApplicationBuilder.Logging.AddLog4Net(loggingOptions);

        // Fluent validation
        webApplicationBuilder.Services.AddFluentValidation(
            opt =>
        {
            opt.RegisterValidatorsFromAssembly(executingAssembly);

            opt.ValidatorOptions.DisplayNameResolver = (type, memberInfo, expression)
                                                       => memberInfo?
                                                       .GetCustomAttribute <System.ComponentModel.DataAnnotations.DisplayAttribute>()?.GetName();
        });

        //Databases
        var databaseEngine = webApplicationBuilder.Configuration["AppSettings:DatabaseEngine"];

        var(connectionString, isSqlServer) = webApplicationBuilder.AddDatabases(databaseEngine);

        //Health
        webApplicationBuilder.Services.AddHealthCheck(connectionString, isSqlServer);

        //JSON
        webApplicationBuilder.Services.Configure <JsonOptions>(o =>
        {
            o.SerializerOptions.WriteIndented = true;
        });

        webApplicationBuilder.Services.AddSecurityUsingOpenIddict(webApplicationBuilder.Configuration, webApplicationBuilder.Environment);
    }