using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PARR.Core.Repositories.Interfaces;
using PARR.Core.Repositories.Interfaces.Job;
using PARR.Core.Repositories.Interfaces.JobGroupRepositories;
using PARR.Core.Repositories.Interfaces.RobotRepositories;
using PARR.Core.Repositories.Interfaces.Schedule;
using PARR.Core.Repositories.Interfaces.TaskRepositories;
using PARR.Core.Repositories.Interfaces.Unit;
using PARR.DAL.Configurations.DbSettings;
using PARR.DAL.Context;
using PARR.DAL.Repositories;
using PARR.DAL.Repositories.Job;
using PARR.DAL.Repositories.JobGroupRepositories;
using PARR.DAL.Repositories.RobotRepositories;
using PARR.DAL.Repositories.Schedule;
using PARR.DAL.Repositories.TaskRepositories;
using PARR.DAL.Repositories.Unit;
using PARR.Domain.Settings;
namespace PARR.DAL
{
public static class DependencyInjection
{
// TODO: Избавиться от лишнего
///
/// Устанавливает Dal сервисы (1)
///
///
///
public static void AddDalServices(this IServiceCollection services, IConfiguration configuration)
{
//.EnableSensitiveDataLogging() - вкл подробное логирование при применении миграций, на проде выключить
services.AddDbContext(opt =>
opt
.EnableSensitiveDataLogging()
.UseNpgsql(configuration.GetConnectionString("DefaultConnection"))
);
// -----------------
// TODO: Переделать все репозитории, которые работаютс с PG с AddTransient на AddScoped
// -----------------
// Entity services
//services.AddTransient();
//services.AddTransient();
//services.AddTransient();
//services.AddTransient();
//services.AddTransient();
//services.AddTransient();
//services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
//services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
//services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddScoped();
#region Schedule
services.AddTransient();
services.AddTransient();
#endregion
#region Unit
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
#endregion
#region Job
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
#endregion
#region JobGroup
services.AddScoped();
services.AddScoped();
services.AddScoped();
services.AddScoped();
#endregion
#region Task
services.AddScoped();
services.AddScoped();
services.AddScoped();
#endregion
//services.AddTransient();
#region NextRun Services
//services.AddTransient();
//services.AddTransient();
//services.AddTransient();
#endregion
#region DomainServces
//services.AddTransient();
//services.AddTransient();
//services.AddTransient();
//services.Configure(options =>
//{
// options.LoadBatchSize = 50;
//});
#endregion
}
///
/// Добавляет конфигурацию Dal (2)
///
///
///
///
public static IConfigurationBuilder AddDalConfigurations(this IConfigurationBuilder builder, IServiceCollection services)
{
builder.Add(new DBConfigurationSource(services));
return builder;
}
///
/// Добавляет конфигурацию в сервисы (3)
///
///
///
public static void AddDallSettings(this IServiceCollection services, IConfiguration configuration)
{
//SettingsFromDb configuration
var settingsFromDb = new SettingsFromDb();
configuration.GetSection(nameof(SettingsFromDb)).Bind(settingsFromDb);
services.AddSingleton(settingsFromDb);
PrefixSettings.PrefixWithoutVariable = settingsFromDb.TemplatePrefixWithoutVariable;
// Сервис - Расписание в ЕСПП. Смещение часового пояса относительно МСК для зоны ответственности рабочей группы
services.AddSingleton(provider =>
{
using var scope = provider.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService();
var settingsFromDb = scope.ServiceProvider.GetRequiredService();
var logger = scope.ServiceProvider.GetRequiredService>();
return new ScheduleResponseAreaTimeOffsetRepository(dbContext, settingsFromDb, logger);
});
}
}
}