using System;
using System.Linq;
using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using xCommons.Extensions;
using xCommons.Helpers;
using xDataService.Configuration;
using xDataService.Constants;
using xDataService.Db;
using xDataService.Helpers;
using xDataService.Interfaces;
using xDataService.Models;
using xExceptions.Constants;
namespace xDataService.DI
{
public static partial class XDIHelperExtension
{
///
/// Retrive XDataService Configurations
///
///
///
///
public static XDataServiceConfiguration GetXDataServiceConfiguration(
this IConfiguration source
)
{
//
var xDataServiceConfigSection = source
.GetSection(ConfigurationNodeNames.DATA_SERVICE_NODE);
var result = xDataServiceConfigSection.Get();
//
return result;
}
///
/// Register XDataService Configuration ...
///
///
///
public static void AddXDataServiceConfiguration(
this IServiceCollection source,
IConfiguration configuration
)
{
//
var config = configuration.GetXDataServiceConfiguration();
if (config.IsNullOrDefault())
{
//
Log("Configurations Not Founded ...");
XException.NotFound.Throw();
}
//
source.AddSingleton(config);
}
///
/// Register XDataService Configuration ...
///
///
///
public static void AddXDataServiceConfiguration(
this IServiceCollection source,
XDataServiceConfiguration configuration
)
{
//
if (configuration.IsNullOrDefault())
{
//
Log("Configurations Not Founded ...");
XException.NotFound.Throw();
}
//
source.AddSingleton(configuration);
}
public static void AddXDatabase(
this IServiceCollection source,
IConfiguration configuration,
XDatabaseDescriptor descriptor,
ServiceLifetime lifetime = ServiceLifetime.Scoped
)
{
//
// Validate Database Descriptor ...
var isValid =
!descriptor.IsNullOrDefault() &&
!descriptor.Name.IsNullOrEmpty();
if (!isValid)
{
//
Log("Invalid Database Descriptor ...");
return;
}
//
// Check Service Collection Validation ...
isValid =
!source.IsNull() &&
!configuration.IsNull();
if (!isValid)
{
//
Log("Invalid Service Provider or Configuration ...");
return;
}
//
// Get Registere Data Service Configuration ...
var xDataServiceConfiguration = source
.GetRegisteredService();
isValid = !xDataServiceConfiguration.IsNullOrDefault();
if (!isValid)
{
//
// Extract Configuration from Configuration ...
xDataServiceConfiguration = configuration.GetXDataServiceConfiguration();
isValid = !xDataServiceConfiguration.IsNullOrDefault();
if (!isValid)
{
//
Log("DataService Configuration notProvided ...");
return;
}
//
// Register Configuration in DI ...
source.AddSingleton(xDataServiceConfiguration);
}
//
// Check Data Service Configuration has Database ...
isValid =
!xDataServiceConfiguration.Databases.IsNullOrDefault() &&
xDataServiceConfiguration.Databases.HasChild() &&
xDataServiceConfiguration.Databases.Keys.Contains(descriptor.Name);
if (!isValid)
{
//
Log("Invalid Database Descriptor ...");
return;
}
//
// Configure Database Descriptor ...
descriptor.Configure(source);
//
// Register Context ...
if (!descriptor.Context.IsNull() &&
descriptor.Provider != XDbProviders.None &&
!descriptor.ConnectionString.IsNullOrEmpty())
{
//
typeof(XDataServiceHelper).InvokeGenericMethod(
methodName: "AddXDbContext",
runtimeType: descriptor.Context,
args: [
source,
descriptor.Provider,
descriptor.ConnectionString,
lifetime,
descriptor.OptionsBuilder
]
);
//
// source.AddXDbContext(
// lifetime: lifetime,
// provider: descriptor.Provider,
// optionsBuilder: descriptor.OptionsBuilder,
// connectionString: descriptor.ConnectionString
// );
}
//
// Register Repositories ...
if (!descriptor.Repositories.IsNull() &&
descriptor.Repositories.HasChild())
{
// source.AddXDataRepositories(
// );
}
}
//
#region Private ...
///
/// a LogTag for xDataService ...
///
private static string XLogTag = "xDataService";
///
/// print a log in Console ...
///
///
private static void Log(string message)
{
Console.WriteLine($"{XLogTag} => {message}");
}
///
/// Register DbContext ...
///
///
///
///
///
///
///
private static void AddXDbContext(
this IServiceCollection source,
XDbProviders provider,
string connectionString,
ServiceLifetime lifetime = ServiceLifetime.Scoped,
Action optionsBuilder = null
)
where TContext : XDbContext
{
//
if (provider == XDbProviders.None)
{
//
Log("Invalid Db Provider ...");
XException.InvalidArgs.Throw();
}
//
switch (provider)
{
//
// MySQL ...
case XDbProviders.MySQL:
//
source.AddDbContext(cfg =>
{
cfg.UseMySQL(connectionString, optionsBuilder);
}, lifetime);
break;
//
// SQLite ...
case XDbProviders.SQLite:
//
source.AddDbContext(cfg =>
{
cfg.UseSqlite(connectionString, optionsBuilder);
}, lifetime);
break;
//
// SQLServer ...
case XDbProviders.SQLServer:
//
source.AddDbContext(cfg =>
{
cfg.UseSqlServer(connectionString, optionsBuilder);
}, lifetime);
break;
//
case XDbProviders.MongoDB:
// There is notRequired to Register DBConext forMongo DB ...
break;
}
}
///
/// Do Seeding Initialization Data on DbContext
///
///
private static void SeedData(
this IApplicationBuilder app
)
{
//
using (var scope = app.ApplicationServices.CreateScope())
{
//
var dbSeeder = scope.ServiceProvider.GetService();
Console.WriteLine($"XDataService: dbSeeder retrieved from DI is => {!dbSeeder.IsNull()}");
//
if (!dbSeeder.IsNull())
{
try
{
//
dbSeeder.Seed()
.GetAwaiter()
.GetResult();
}
catch (Exception ex)
{
//
Console.WriteLine(" ");
Console.WriteLine($"XDataService: Seeding Error: {ex.Message}");
XException.InvalidConfiguration.Throw();
}
}
}
}
#endregion
}
}