using System;
using GraphQL.Server;
using GraphQL.Types;
using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MySql.EntityFrameworkCore.Extensions;
using xCommons.Extensions;
using xDataService.Constants;
using xDataService.Db;
using xDataService.EFRepositories;
using xDataService.Events;
using xDataService.Extensions;
using xDataService.GraphQL;
using xDataService.InMemRepositories;
using xDataService.Interfaces;
using xDataService.Models;
using xDataService.MongoRepositories;
using xDataService.Providers;
using xExceptions.Constants;
using xModels.Base;
namespace xDataService.Helpers
{
public static class XDataServiceHelper
{
///
/// Register DbContext ...
///
///
///
///
///
///
///
public static void AddXDbContext(
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.AddEntityFrameworkMySQL();
source.AddDbContext(cfg =>
{
cfg.UseMySQL(connectionString, optionsBuilder);
}, lifetime);
break;
//
// SQLite ...
case XDbProviders.SQLite:
//
source.AddEntityFrameworkSqlite();
source.AddDbContext(cfg =>
{
cfg.UseSqlite(connectionString, optionsBuilder);
}, lifetime);
break;
//
// SQLServer ...
case XDbProviders.SQLServer:
//
source.AddEntityFrameworkSqlServer();
source.AddDbContext(cfg =>
{
cfg.UseSqlServer(connectionString, optionsBuilder);
}, lifetime);
break;
//
case XDbProviders.MongoDB:
// There is notRequired to Register DBConext forMongo DB ...
break;
}
//
var isValid =
provider == XDbProviders.MySQL ||
provider == XDbProviders.SQLite ||
provider == XDbProviders.SQLServer;
if (isValid)
{
//
AddXUnitOfWorks(
source,
lifetime
);
}
}
//
#region Repository ...
///
/// Register Repository ...
///
///
///
///
///
///
///
public static void AddXRepository(
IServiceCollection source,
XRepositoryDescriptor repositoryDescriptor,
ServiceLifetime lifetime = ServiceLifetime.Scoped
)
where TEntity : XBaseEntity
{
//
var isValid = repositoryDescriptor.IsValid();
if (!isValid)
{
return;
}
}
///
/// Register Repository ...
///
///
///
///
///
///
///
///
///
public static void AddXRepository(
IServiceCollection source,
XRepositoryDescriptor repositoryDescriptor,
ServiceLifetime lifetime = ServiceLifetime.Scoped
)
where TEntity : XBaseEntity
where TKeyGeneratorService : IXKeyGenerator
where TKeyGeneratorImplementation : XKeyGenerator
{
//
var isValid = repositoryDescriptor.IsValid();
if (!isValid)
{
return;
}
//
// Register KeyGenerator ...
isValid = repositoryDescriptor.HasKeyGenerator();
if (isValid)
{
//
AddXKeyGenerator(
source,
repositoryDescriptor,
lifetime
);
}
}
///
/// Register Repository ...
///
///
///
///
///
///
///
///
///
///
///
public static void AddXRepository(
IServiceCollection source,
XRepositoryDescriptor repositoryDescriptor,
ServiceLifetime lifetime = ServiceLifetime.Scoped
)
where TEntity : XBaseEntity
where TEventsService : IXBaseRepositoryEvents
where TKeyGeneratorService : IXKeyGenerator
where TEventsImplementation : XBaseRepositoryEvents
where TKeyGeneratorImplementation : XKeyGenerator
{
//
var isValid = repositoryDescriptor.IsValid();
if (!isValid)
{
return;
}
//
// Register KeyGenerator ...
isValid = repositoryDescriptor.HasKeyGenerator();
if (isValid)
{
//
AddXKeyGenerator(
source,
repositoryDescriptor,
lifetime
);
}
//
// Register Events ...
isValid = repositoryDescriptor.HasEvents();
if (isValid)
{
//
AddXEvents(
source,
repositoryDescriptor,
lifetime
);
}
}
///
/// Register Repository ...
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
public static void AddXRepository(
IServiceCollection source,
XRepositoryDescriptor repositoryDescriptor,
ServiceLifetime lifetime = ServiceLifetime.Scoped
)
where TGraphSchema : Schema
where TGraphKey : IGraphType
where TEntity : XBaseEntity
where TGraph : XBaseGraphObjectType
where TEventsService : IXBaseRepositoryEvents
where TKeyGeneratorService : IXKeyGenerator
where TEventsImplementation : XBaseRepositoryEvents
where TKeyGeneratorImplementation : XKeyGenerator
where TGraphTypeHelperService : IXBaseGraphQLTypeHelper
where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper
where TGraphQueryService : IXBaseGraphQLQuery
where TGraphQueryImplementation : XBaseGraphQLQuery
{
//
var isValid = repositoryDescriptor.IsValid();
if (!isValid)
{
return;
}
//
// Register KeyGenerator ...
isValid = repositoryDescriptor.HasKeyGenerator();
if (isValid)
{
//
AddXKeyGenerator(
source,
repositoryDescriptor,
lifetime
);
}
//
// Register Events ...
isValid = repositoryDescriptor.HasEvents();
if (isValid)
{
//
AddXEvents(
source,
repositoryDescriptor,
lifetime
);
}
//
// Register Graph ...
isValid = repositoryDescriptor.HasGraphSupport();
if (isValid)
{
//
AddXGraphQL(
source,
repositoryDescriptor,
lifetime
);
}
}
///
/// Register Repository ...
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
public static void AddXRepository(
IServiceCollection source,
XInMemoryRepositoryDescriptor repositoryDescriptor,
ServiceLifetime lifetime = ServiceLifetime.Scoped
)
where TGraphSchema : Schema
where TGraphKey : IGraphType
where TEntity : XBaseEntity
where TGraph : XBaseGraphObjectType
where TEventsService : IXBaseRepositoryEvents
where TKeyGeneratorService : IXKeyGenerator
where TRepositoryService : IXBaseRepository
where TEventsImplementation : XBaseRepositoryEvents
where TKeyGeneratorImplementation : XKeyGenerator
where TGraphTypeHelperService : IXBaseGraphQLTypeHelper
where TRepositoryImplementation : XBaseInMemoryRepositoy
where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper
where TGraphQueryService : IXBaseGraphQLQuery
where TGraphQueryImplementation : XBaseGraphQLQuery
{
//
var isValid = repositoryDescriptor.IsValid();
if (!isValid)
{
return;
}
//
// Register KeyGenerator ...
isValid = repositoryDescriptor.HasKeyGenerator();
if (isValid)
{
//
AddXKeyGenerator(
source,
repositoryDescriptor,
lifetime
);
}
//
// Register Events ...
isValid = repositoryDescriptor.HasEvents();
if (isValid)
{
//
AddXEvents(
source,
repositoryDescriptor,
lifetime
);
}
//
// Register Graph ...
isValid = repositoryDescriptor.HasGraphSupport();
if (isValid)
{
//
AddXGraphQL(
source,
repositoryDescriptor,
lifetime
);
}
//
// Register Repository ...
isValid = repositoryDescriptor.HasRepository();
if (isValid)
{
//
source.Add(
new ServiceDescriptor(
repositoryDescriptor.RepositoryService,
repositoryDescriptor.RepositoryImplementation,
lifetime
)
);
}
}
///
/// Register Repository ...
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
public static void AddXRepository(
IServiceCollection source,
XMongoRepositoryDescriptor repositoryDescriptor,
ServiceLifetime lifetime = ServiceLifetime.Scoped
)
where TGraphSchema : Schema
where TGraphKey : IGraphType
where TEntity : XBaseEntity
where TGraph : XBaseGraphObjectType
where TEventsService : IXBaseRepositoryEvents
where TKeyGeneratorService : IXKeyGenerator
where TRepositoryService : IXBaseRepository
where TEventsImplementation : XBaseRepositoryEvents
where TKeyGeneratorImplementation : XKeyGenerator
where TGraphTypeHelperService : IXBaseGraphQLTypeHelper
where TRepositoryImplementation : XBaseMongoRepository
where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper
where TGraphQueryService : IXBaseGraphQLQuery
where TGraphQueryImplementation : XBaseGraphQLQuery
{
//
var isValid = repositoryDescriptor.IsValid();
if (!isValid)
{
return;
}
//
// Register KeyGenerator ...
isValid = repositoryDescriptor.HasKeyGenerator();
if (isValid)
{
//
AddXKeyGenerator(
source,
repositoryDescriptor,
lifetime
);
}
//
// Register Events ...
isValid = repositoryDescriptor.HasEvents();
if (isValid)
{
//
AddXEvents(
source,
repositoryDescriptor,
lifetime
);
}
//
// Register Graph ...
isValid = repositoryDescriptor.HasGraphSupport();
if (isValid)
{
//
AddXGraphQL(
source,
repositoryDescriptor,
lifetime
);
}
//
// Register Repository ...
isValid = repositoryDescriptor.HasRepository();
if (isValid)
{
//
source.Add(
new ServiceDescriptor(
repositoryDescriptor.RepositoryService,
repositoryDescriptor.RepositoryImplementation,
lifetime
)
);
}
}
///
/// Register Repository ...
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
public static void AddXRepository(
IServiceCollection source,
XEFRepositoryDescriptor repositoryDescriptor,
ServiceLifetime lifetime = ServiceLifetime.Scoped
)
where TGraphSchema : Schema
where TContext : XDbContext
where TGraphKey : IGraphType
where TEntity : XBaseEntity
where TGraph : XBaseGraphObjectType
where TEventsService : IXBaseRepositoryEvents
where TKeyGeneratorService : IXKeyGenerator
where TRepositoryService : IXBaseRepository
where TEventsImplementation : XBaseRepositoryEvents
where TKeyGeneratorImplementation : XKeyGenerator
where TGraphTypeHelperService : IXBaseGraphQLTypeHelper
where TRepositoryImplementation : XBaseEFRepository
where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper
where TGraphQueryService : IXBaseGraphQLQuery
where TGraphQueryImplementation : XBaseGraphQLQuery
{
//
var isValid = repositoryDescriptor.IsValid();
if (!isValid)
{
return;
}
//
// Register KeyGenerator ...
isValid = repositoryDescriptor.HasKeyGenerator();
if (isValid)
{
//
AddXKeyGenerator(
source,
repositoryDescriptor,
lifetime
);
}
//
// Register Events ...
isValid = repositoryDescriptor.HasEvents();
if (isValid)
{
//
AddXEvents(
source,
repositoryDescriptor,
lifetime
);
}
//
// Register Graph ...
isValid = repositoryDescriptor.HasGraphSupport();
if (isValid)
{
//
AddXGraphQL(
source,
repositoryDescriptor,
lifetime
);
}
//
// Register Repository ...
isValid = repositoryDescriptor.HasRepository();
if (isValid)
{
//
source.Add(
new ServiceDescriptor(
repositoryDescriptor.RepositoryService,
repositoryDescriptor.RepositoryImplementation,
lifetime
)
);
}
}
///
/// Register Repository ...
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
public static void UseXRepository(
IApplicationBuilder source,
XInMemoryRepositoryDescriptor repositoryDescriptor
)
where TGraphSchema : Schema
where TGraphKey : IGraphType
where TEntity : XBaseEntity
where TGraph : XBaseGraphObjectType
where TEventsService : IXBaseRepositoryEvents
where TKeyGeneratorService : IXKeyGenerator
where TRepositoryService : IXBaseRepository
where TEventsImplementation : XBaseRepositoryEvents
where TKeyGeneratorImplementation : XKeyGenerator
where TGraphTypeHelperService : IXBaseGraphQLTypeHelper
where TRepositoryImplementation : XBaseInMemoryRepositoy
where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper
where TGraphQueryService : IXBaseGraphQLQuery
where TGraphQueryImplementation : XBaseGraphQLQuery
{
//
var isValid = repositoryDescriptor.IsValid();
if (!isValid)
{
return;
}
//
// GraphQL ...
isValid = repositoryDescriptor.HasGraphSupport();
if (isValid)
{
//
UseXGraphQL(
source,
repositoryDescriptor
);
}
}
///
/// Register Repository ...
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
public static void UseXRepository(
IApplicationBuilder source,
XMongoRepositoryDescriptor repositoryDescriptor
)
where TGraphSchema : Schema
where TGraphKey : IGraphType
where TEntity : XBaseEntity
where TGraph : XBaseGraphObjectType
where TEventsService : IXBaseRepositoryEvents
where TKeyGeneratorService : IXKeyGenerator
where TRepositoryService : IXBaseRepository
where TEventsImplementation : XBaseRepositoryEvents
where TKeyGeneratorImplementation : XKeyGenerator
where TGraphTypeHelperService : IXBaseGraphQLTypeHelper
where TRepositoryImplementation : XBaseMongoRepository
where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper
where TGraphQueryService : IXBaseGraphQLQuery
where TGraphQueryImplementation : XBaseGraphQLQuery
{
//
var isValid = repositoryDescriptor.IsValid();
if (!isValid)
{
return;
}
//
// GraphQL ...
isValid = repositoryDescriptor.HasGraphSupport();
if (isValid)
{
//
UseXGraphQL(
source,
repositoryDescriptor
);
}
}
///
/// Register Repository ...
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
public static void UseXRepository(
IApplicationBuilder source,
XEFRepositoryDescriptor repositoryDescriptor
)
where TGraphSchema : Schema
where TContext : XDbContext
where TGraphKey : IGraphType
where TEntity : XBaseEntity
where TGraph : XBaseGraphObjectType
where TEventsService : IXBaseRepositoryEvents
where TKeyGeneratorService : IXKeyGenerator
where TRepositoryService : IXBaseRepository
where TEventsImplementation : XBaseRepositoryEvents
where TKeyGeneratorImplementation : XKeyGenerator
where TGraphTypeHelperService : IXBaseGraphQLTypeHelper
where TRepositoryImplementation : XBaseEFRepository
where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper
where TGraphQueryService : IXBaseGraphQLQuery
where TGraphQueryImplementation : XBaseGraphQLQuery
{
//
var isValid = repositoryDescriptor.IsValid();
if (!isValid)
{
return;
}
//
// GraphQL ...
isValid = repositoryDescriptor.HasGraphSupport();
if (isValid)
{
//
UseXGraphQL(
source,
repositoryDescriptor
);
}
}
#endregion
//
#region Private ...
///
/// Register Unit of Works ...
///
///
///
///
public static void AddXUnitOfWorks(
IServiceCollection source,
ServiceLifetime lifetime = ServiceLifetime.Scoped
)
where TContext : XDbContext
{
//
source.Add(
new ServiceDescriptor(
typeof(IXUnitOfWorks),
typeof(XUnitOfWorks),
lifetime
)
);
}
///
/// Register Key Generator Service ...
///
///
///
///
///
///
///
///
///
public static void AddXKeyGenerator(
IServiceCollection source,
XRepositoryDescriptor repositoryDescriptor,
ServiceLifetime lifetime = ServiceLifetime.Scoped
)
where TEntity : XBaseEntity
where TKeyGeneratorService : IXKeyGenerator
where TKeyGeneratorImplementation : XKeyGenerator
{
//
// Validate ...
var isValid =
!source.IsNull() &&
!repositoryDescriptor.IsNull() &&
!repositoryDescriptor.KeyGeneratorService.IsNull() &&
!repositoryDescriptor.KeyGeneratorImplementation.IsNull();
if (!isValid)
{
return;
}
//
// Register ...
source.Add(
new ServiceDescriptor(
repositoryDescriptor.KeyGeneratorService,
repositoryDescriptor.KeyGeneratorImplementation,
lifetime
)
);
}
///
/// Register Events Service ...
///
///
///
///
///
///
///
///
///
public static void AddXEvents(
IServiceCollection source,
XRepositoryDescriptor repositoryDescriptor,
ServiceLifetime lifetime = ServiceLifetime.Scoped
)
where TEntity : XBaseEntity
where TEventsService : IXBaseRepositoryEvents
where TEventsImplementation : XBaseRepositoryEvents
{
//
// Validate ...
var isValid =
!source.IsNull() &&
!repositoryDescriptor.IsNull() &&
!repositoryDescriptor.EventsService.IsNull() &&
!repositoryDescriptor.EventsImplementation.IsNull();
if (!isValid)
{
return;
}
//
// Register ...
source.Add(
new ServiceDescriptor(
repositoryDescriptor.EventsService,
repositoryDescriptor.EventsImplementation,
lifetime
)
);
}
///
/// Register GraphQL Service ...
///
///
///
///
///
///
///
///
///
///
///
///
///
///
public static void AddXGraphQL(
IServiceCollection source,
XRepositoryDescriptor repositoryDescriptor,
ServiceLifetime lifetime = ServiceLifetime.Scoped
)
where TGraphSchema : Schema
where TGraphKey : IGraphType
where TEntity : XBaseEntity
where TGraph : XBaseGraphObjectType
where TGraphTypeHelperService : IXBaseGraphQLTypeHelper
where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper
where TGraphQueryService : IXBaseGraphQLQuery
where TGraphQueryImplementation : XBaseGraphQLQuery
{
//
// Validate ...
var isValid =
!source.IsNull() &&
!repositoryDescriptor.IsNull() &&
!repositoryDescriptor.GraphType.IsNull() &&
!repositoryDescriptor.GraphSchema.IsNull() &&
!repositoryDescriptor.GraphTypeKey.IsNull() &&
!repositoryDescriptor.GraphQueryService.IsNull() &&
!repositoryDescriptor.GraphTypeHelperService.IsNull() &&
!repositoryDescriptor.GraphQueryImplementation.IsNull() &&
!repositoryDescriptor.GraphTypeHelperImplementation.IsNull();
if (!isValid)
{
return;
}
//
// Register Graph Type ...
var builder = source.GetRegisteredService();
if (builder.IsNull())
{
//
Action options = x => { };
builder = source.AddGraphQL(options)
.AddNewtonsoftJson(deserializerSettings => { }, serializerSettings => { })
.AddWebSockets()
.AddDataLoader()
.AddGraphTypes();
}
builder.AddGraphTypes(repositoryDescriptor.GraphType);
//
// Register Graph Schema ...
source.Add(
new ServiceDescriptor(
repositoryDescriptor.GraphSchema,
repositoryDescriptor.GraphSchema,
lifetime
)
);
//
// Register Graph Query ...
source.Add(
new ServiceDescriptor(
repositoryDescriptor.GraphQueryService,
repositoryDescriptor.GraphQueryImplementation,
lifetime
)
);
//
// Register Graph Type Helper ...
source.Add(
new ServiceDescriptor(
repositoryDescriptor.GraphTypeHelperService,
repositoryDescriptor.GraphTypeHelperImplementation,
lifetime: ServiceLifetime.Singleton
)
);
}
///
/// Use GraphQL Middleware ...
///
///
///
///
///
///
///
///
///
///
///
///
///
///
public static void UseXGraphQL(
IApplicationBuilder source,
XRepositoryDescriptor repositoryDescriptor
)
where TGraphSchema : Schema
where TGraphKey : IGraphType
where TEntity : XBaseEntity
where TGraph : XBaseGraphObjectType
where TGraphTypeHelperService : IXBaseGraphQLTypeHelper
where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper
where TGraphQueryService : IXBaseGraphQLQuery
where TGraphQueryImplementation : XBaseGraphQLQuery
{
//
// Validate ...
var isValid =
!source.IsNull() &&
!repositoryDescriptor.IsNull() &&
!repositoryDescriptor.GraphType.IsNull() &&
!repositoryDescriptor.GraphSchema.IsNull() &&
!repositoryDescriptor.GraphTypeKey.IsNull() &&
!repositoryDescriptor.GraphQueryService.IsNull() &&
!repositoryDescriptor.GraphTypeHelperService.IsNull() &&
!repositoryDescriptor.GraphQueryImplementation.IsNull() &&
!repositoryDescriptor.GraphTypeHelperImplementation.IsNull();
if (!isValid)
{
return;
}
//
// Create an Scope for Services Acces ...
using (var scope = source.ApplicationServices.CreateScope())
{
//
// Inject GraphQL Type Helper ...
var helper = scope.ServiceProvider.GetService();
//
source.UseGraphQL(helper.GetGraphQLPath());
source.UseGraphQLWebSockets();
}
}
#endregion
}
}