// This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            //Connection database
            var connectionString = _configuration["MySqlConnection:MySqlConnection"];

            services.AddDbContext <MySQLContext>(options => options.UseMySql(connectionString));

            //Add Migrations support
            ExecuteMigrations(connectionString);

            //Jwt
            var signingConfigurations = new SigningConfigurations();

            services.AddSingleton(signingConfigurations);

            var tokenCongigurations = new TokenCofiguration();

            new ConfigureFromConfigurationOptions <TokenCofiguration>(
                _configuration.GetSection("TokenCofigurations")
                )
            .Configure(tokenCongigurations);

            services.AddSingleton(tokenCongigurations);

            services.AddAuthentication(authOptions =>
            {
                authOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                authOptions.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(bearerOptions =>
            {
                var paramsValidation = bearerOptions.TokenValidationParameters;
                paramsValidation.IssuerSigningKey = signingConfigurations.Key;
                paramsValidation.ValidAudience    = tokenCongigurations.Audience;
                paramsValidation.ValidIssuer      = tokenCongigurations.Issuer;

                // Validates the signing of a received token
                paramsValidation.ValidateIssuerSigningKey = true;

                // Checks if a received token is still valid
                paramsValidation.ValidateLifetime = true;

                // Tolerance time for the expiration of a token (used in case
                // of time synchronization problems between different
                // computers involved in the communication process)
                paramsValidation.ClockSkew = TimeSpan.Zero;
            });

            services.AddAuthorization(auth =>
            {
                auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
                               .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
                               .RequireAuthenticatedUser().Build());
            });

            //Add Framework services.
            services.AddMvc(options =>
            {
                options.RespectBrowserAcceptHeader = true;
                options.FormatterMappings.SetMediaTypeMappingForFormat("xml", MediaTypeHeaderValue.Parse("text/xml"));
                options.FormatterMappings.SetMediaTypeMappingForFormat("json", MediaTypeHeaderValue.Parse("application/json"));
            })
            .AddXmlSerializerFormatters();

            //Define as opções do filtro HATEOAS
            var filterOptions = new HyperMediaFilterOptions();

            filterOptions.ObjectContentResponseEnricherList.Add(new PersonEnricher());
            filterOptions.ObjectContentResponseEnricherList.Add(new BookEnricher());

            //Injeta o serviço
            services.AddSingleton(filterOptions);

            services.AddApiVersioning(option => option.ReportApiVersions = true);

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1",
                             new Info
                {
                    Title   = "RESTful API With ASP.NET Core 2.0",
                    Version = "v1"
                });
            });
            //Dependency Injection
            services.AddScoped <IPersonBusiness, PersonBusinessImpl>();
            services.AddScoped <IBookBusiness, BookBusinessImpl>();
            services.AddScoped <ILoginBusiness, LoginBusinessImpl>();
            services.AddScoped <IFileBusiness, FileBusinessImpl>();

            services.AddScoped <IUserRepository, UserRepositoryImpl>();
            services.AddScoped <IPersonRepository, PersonRepositoryImpl>();

            services.AddScoped(typeof(IPersonRepository <>), typeof(GenericRepository <>));
        }
 public LoginBusinessImpl(IUserRepository repository, SigningConfigurations signingConfigurations, TokenCofiguration tokenCofigurarion)
 {
     _repository            = repository;
     _signingConfigurations = signingConfigurations;
     _tokenCofigurarion     = tokenCofigurarion;
 }