From 07f4435f9a65b9913081d1309673fc324fe540c6 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Sun, 10 May 2026 00:12:59 +0330 Subject: [PATCH] fix GraphQL DI Registration Using Generics ... --- DI/XDIHelperExtension.cs | 12 +- Extensions/XDatabaseDescriptorExtensions.cs | 38 ++ Extensions/XRepositoryDescriptorExtensions.cs | 3 +- Helpers/XDataServiceHelper.cs | 413 +++++++++++++----- Models/XRepositoryDescriptor.cs | 157 ++++++- Providers/XLongKeyGenerator.cs | 45 ++ 6 files changed, 530 insertions(+), 138 deletions(-) create mode 100644 Providers/XLongKeyGenerator.cs diff --git a/DI/XDIHelperExtension.cs b/DI/XDIHelperExtension.cs index a4c2439..528d43f 100644 --- a/DI/XDIHelperExtension.cs +++ b/DI/XDIHelperExtension.cs @@ -135,7 +135,7 @@ namespace xDataService.DI if (!isValid) { // - Log("DataService Configuration notProvided ..."); + Log("DataService Configuration not provided ..."); return; } @@ -176,10 +176,8 @@ namespace xDataService.DI runtimeType: descriptor.Context, args: [ source, - descriptor.Provider, - descriptor.ConnectionString, - lifetime, - descriptor.OptionsBuilder + descriptor, + lifetime ] ); @@ -213,8 +211,8 @@ namespace xDataService.DI runtimeTypes: runtimeTypes, args: [ source, - r, - lifetime + r, + lifetime ] ); diff --git a/Extensions/XDatabaseDescriptorExtensions.cs b/Extensions/XDatabaseDescriptorExtensions.cs index 779c027..f34bab0 100644 --- a/Extensions/XDatabaseDescriptorExtensions.cs +++ b/Extensions/XDatabaseDescriptorExtensions.cs @@ -1,4 +1,5 @@ using xCommons.Extensions; +using xDataService.Constants; using xDataService.Models; namespace xDataService.Extensions @@ -21,6 +22,22 @@ namespace xDataService.Extensions return result; } + /// + /// Chack a Descriptor Has Provider or not ... + /// + /// + /// + public static bool HasProvider(this XDatabaseDescriptor source) + { + // + var result = + source.IsValid() && + source.Provider != XDbProviders.None; + + // + return result; + } + /// /// Check a Descriptor Has EF Core Context or not ... /// @@ -31,6 +48,8 @@ namespace xDataService.Extensions // var result = source.IsValid() && + source.HasProvider() && + source.Provider != XDbProviders.MongoDB && !source.Context.IsNull(); // @@ -47,11 +66,30 @@ namespace xDataService.Extensions // var result = source.IsValid() && + source.HasProvider() && !source.Repositories.IsNull() && source.Repositories.HasChild(); // return result; } + + /// + /// Check a Descriptor Has MongoDB Convention Packs ... + /// + /// + /// + public static bool HasConventionPacks(this XDatabaseDescriptor source) + { + // + var result = + source.IsValid() && + source.HasProvider() && + source.Provider == XDbProviders.MongoDB && + !source.ConventionPacks.IsNull(); + + // + return result; + } } } \ No newline at end of file diff --git a/Extensions/XRepositoryDescriptorExtensions.cs b/Extensions/XRepositoryDescriptorExtensions.cs index aea5029..58eaf16 100644 --- a/Extensions/XRepositoryDescriptorExtensions.cs +++ b/Extensions/XRepositoryDescriptorExtensions.cs @@ -65,11 +65,10 @@ namespace xDataService.Extensions var result = source.IsValid() && !source.GraphType.IsNull() && + !source.GraphQuery.IsNull() && !source.GraphSchema.IsNull() && !source.GraphTypeKey.IsNull() && - !source.GraphQueryService.IsNull() && !source.GraphTypeHelperService.IsNull() && - !source.GraphQueryImplementation.IsNull() && !source.GraphTypeHelperImplementation.IsNull(); // diff --git a/Helpers/XDataServiceHelper.cs b/Helpers/XDataServiceHelper.cs index f7338c2..1667f5c 100644 --- a/Helpers/XDataServiceHelper.cs +++ b/Helpers/XDataServiceHelper.cs @@ -4,6 +4,8 @@ using GraphQL.Types; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; +using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.Conventions; using MySql.EntityFrameworkCore.Extensions; using xCommons.Extensions; using xDataService.Constants; @@ -28,30 +30,27 @@ namespace xDataService.Helpers /// Register DbContext ... /// /// - /// - /// + /// /// - /// /// public static void AddXDbContext( IServiceCollection source, - XDbProviders provider, - string connectionString, - ServiceLifetime lifetime = ServiceLifetime.Scoped, - Action optionsBuilder = null + XDatabaseDescriptor databaseDescriptor, + ServiceLifetime lifetime = ServiceLifetime.Scoped ) where TContext : XDbContext { // - if (provider == XDbProviders.None) + var isValid = + databaseDescriptor.IsValid() && + databaseDescriptor.HasProvider(); + if (!isValid) { - // - // Log("Invalid Db Provider ..."); - XException.InvalidArgs.Throw(); + XException.InvalidConfiguration.Throw(); } // - switch (provider) + switch (databaseDescriptor.Provider) { // // MySQL ... @@ -60,7 +59,11 @@ namespace xDataService.Helpers source.AddEntityFrameworkMySQL(); source.AddDbContext(cfg => { - cfg.UseMySQL(connectionString, optionsBuilder); + // + cfg.UseMySQL( + databaseDescriptor.ConnectionString, + databaseDescriptor.OptionsBuilder + ); }, lifetime); break; @@ -71,7 +74,11 @@ namespace xDataService.Helpers source.AddEntityFrameworkSqlite(); source.AddDbContext(cfg => { - cfg.UseSqlite(connectionString, optionsBuilder); + // + cfg.UseSqlite( + databaseDescriptor.ConnectionString, + databaseDescriptor.OptionsBuilder + ); }, lifetime); break; @@ -82,21 +89,70 @@ namespace xDataService.Helpers source.AddEntityFrameworkSqlServer(); source.AddDbContext(cfg => { - cfg.UseSqlServer(connectionString, optionsBuilder); + // + cfg.UseSqlServer( + databaseDescriptor.ConnectionString, + databaseDescriptor.OptionsBuilder + ); }, lifetime); break; // + // Mongo DB ... case XDbProviders.MongoDB: - // There is notRequired to Register DBConext forMongo DB ... + // + #region XBaseEntity Mappers ... + // + // Map ID as BsonId here ... + BsonClassMap.RegisterClassMap>(cm => + { + // + cm.AutoMap(); + cm.MapIdMember(c => c.Id); + }); + BsonClassMap.RegisterClassMap>(cm => + { + // + cm.AutoMap(); + cm.MapIdMember(c => c.Id); + }); + BsonClassMap.RegisterClassMap>(cm => + { + // + cm.AutoMap(); + cm.MapIdMember(c => c.Id); + }); + BsonClassMap.RegisterClassMap>(cm => + { + // + cm.AutoMap(); + cm.MapIdMember(c => c.Id); + }); + #endregion + + // + // Check Has Convention Packs ... + isValid = databaseDescriptor.HasConventionPacks(); + if (isValid) + { + // + ConventionRegistry.Register( + nameof( + databaseDescriptor.ConventionPacks + ), + databaseDescriptor.ConventionPacks, + type => !type.FullName + .IsNullOrEmpty() + ); + } break; } // - var isValid = - provider == XDbProviders.MySQL || - provider == XDbProviders.SQLite || - provider == XDbProviders.SQLServer; + isValid = + databaseDescriptor.Provider == XDbProviders.MySQL || + databaseDescriptor.Provider == XDbProviders.SQLite || + databaseDescriptor.Provider == XDbProviders.SQLServer; if (isValid) { // @@ -144,7 +200,12 @@ namespace xDataService.Helpers /// /// /// - public static void AddXRepository( + public static void AddXRepository< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation + >( IServiceCollection source, XRepositoryDescriptor repositoryDescriptor, ServiceLifetime lifetime = ServiceLifetime.Scoped @@ -187,7 +248,14 @@ namespace xDataService.Helpers /// /// /// - public static void AddXRepository( + public static void AddXRepository< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation + >( IServiceCollection source, XRepositoryDescriptor repositoryDescriptor, ServiceLifetime lifetime = ServiceLifetime.Scoped @@ -246,15 +314,27 @@ namespace xDataService.Helpers /// /// /// - /// - /// + /// /// /// /// /// - public static void AddXRepository( + public static void AddXRepository< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema + >( IServiceCollection source, - XRepositoryDescriptor repositoryDescriptor, + XRepositoryDescriptor repositoryDescriptor, ServiceLifetime lifetime = ServiceLifetime.Scoped ) where TGraphSchema : Schema @@ -266,9 +346,8 @@ namespace xDataService.Helpers where TEventsImplementation : XBaseRepositoryEvents where TKeyGeneratorImplementation : XKeyGenerator where TGraphTypeHelperService : IXBaseGraphQLTypeHelper + where TGraphQuery : XBaseGraphQLQuery where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { // var isValid = repositoryDescriptor.IsValid(); @@ -309,7 +388,7 @@ namespace xDataService.Helpers if (isValid) { // - AddXGraphQL( + AddXGraphQL( source, repositoryDescriptor, lifetime @@ -331,17 +410,31 @@ namespace xDataService.Helpers /// /// /// - /// - /// + /// /// /// /// /// /// /// - public static void AddXRepository( + public static void AddXRepository< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema, + TRepositoryService, + TRepositoryImplementation + >( IServiceCollection source, - XInMemoryRepositoryDescriptor repositoryDescriptor, + XInMemoryRepositoryDescriptor repositoryDescriptor, ServiceLifetime lifetime = ServiceLifetime.Scoped ) where TGraphSchema : Schema @@ -354,10 +447,9 @@ namespace xDataService.Helpers where TEventsImplementation : XBaseRepositoryEvents where TKeyGeneratorImplementation : XKeyGenerator where TGraphTypeHelperService : IXBaseGraphQLTypeHelper + where TGraphQuery : XBaseGraphQLQuery where TRepositoryImplementation : XBaseInMemoryRepositoy where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { // var isValid = repositoryDescriptor.IsValid(); @@ -398,7 +490,7 @@ namespace xDataService.Helpers if (isValid) { // - AddXGraphQL( + AddXGraphQL( source, repositoryDescriptor, lifetime @@ -435,17 +527,31 @@ namespace xDataService.Helpers /// /// /// - /// - /// + /// /// /// /// /// /// /// - public static void AddXRepository( + public static void AddXRepository< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema, + TRepositoryService, + TRepositoryImplementation + >( IServiceCollection source, - XMongoRepositoryDescriptor repositoryDescriptor, + XMongoRepositoryDescriptor repositoryDescriptor, ServiceLifetime lifetime = ServiceLifetime.Scoped ) where TGraphSchema : Schema @@ -457,11 +563,10 @@ namespace xDataService.Helpers where TRepositoryService : IXBaseRepository where TEventsImplementation : XBaseRepositoryEvents where TKeyGeneratorImplementation : XKeyGenerator - where TGraphTypeHelperService : IXBaseGraphQLTypeHelper where TRepositoryImplementation : XBaseMongoRepository + where TGraphTypeHelperService : IXBaseGraphQLTypeHelper + where TGraphQuery : XBaseGraphQLQuery where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { // var isValid = repositoryDescriptor.IsValid(); @@ -502,7 +607,7 @@ namespace xDataService.Helpers if (isValid) { // - AddXGraphQL( + AddXGraphQL( source, repositoryDescriptor, lifetime @@ -539,8 +644,7 @@ namespace xDataService.Helpers /// /// /// - /// - /// + /// /// /// /// @@ -548,9 +652,25 @@ namespace xDataService.Helpers /// /// /// - public static void AddXRepository( + public static void AddXRepository< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema, + TRepositoryService, + TRepositoryImplementation, + TContext + >( IServiceCollection source, - XEFRepositoryDescriptor repositoryDescriptor, + XEFRepositoryDescriptor repositoryDescriptor, ServiceLifetime lifetime = ServiceLifetime.Scoped ) where TGraphSchema : Schema @@ -564,10 +684,9 @@ namespace xDataService.Helpers where TEventsImplementation : XBaseRepositoryEvents where TKeyGeneratorImplementation : XKeyGenerator where TGraphTypeHelperService : IXBaseGraphQLTypeHelper + where TGraphQuery : XBaseGraphQLQuery where TRepositoryImplementation : XBaseEFRepository where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { // var isValid = repositoryDescriptor.IsValid(); @@ -608,7 +727,7 @@ namespace xDataService.Helpers if (isValid) { // - AddXGraphQL( + AddXGraphQL( source, repositoryDescriptor, lifetime @@ -645,17 +764,31 @@ namespace xDataService.Helpers /// /// /// - /// - /// + /// /// /// /// /// /// /// - public static void UseXRepository( + public static void UseXRepository< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema, + TRepositoryService, + TRepositoryImplementation + >( IApplicationBuilder source, - XInMemoryRepositoryDescriptor repositoryDescriptor + XInMemoryRepositoryDescriptor repositoryDescriptor ) where TGraphSchema : Schema where TGraphKey : IGraphType @@ -668,9 +801,8 @@ namespace xDataService.Helpers where TKeyGeneratorImplementation : XKeyGenerator where TGraphTypeHelperService : IXBaseGraphQLTypeHelper where TRepositoryImplementation : XBaseInMemoryRepositoy + where TGraphQuery : XBaseGraphQLQuery where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { // var isValid = repositoryDescriptor.IsValid(); @@ -685,7 +817,7 @@ namespace xDataService.Helpers if (isValid) { // - UseXGraphQL( + UseXGraphQL( source, repositoryDescriptor ); @@ -706,17 +838,31 @@ namespace xDataService.Helpers /// /// /// - /// - /// + /// /// /// /// /// /// /// - public static void UseXRepository( + public static void UseXRepository< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema, + TRepositoryService, + TRepositoryImplementation + >( IApplicationBuilder source, - XMongoRepositoryDescriptor repositoryDescriptor + XMongoRepositoryDescriptor repositoryDescriptor ) where TGraphSchema : Schema where TGraphKey : IGraphType @@ -727,11 +873,10 @@ namespace xDataService.Helpers where TRepositoryService : IXBaseRepository where TEventsImplementation : XBaseRepositoryEvents where TKeyGeneratorImplementation : XKeyGenerator - where TGraphTypeHelperService : IXBaseGraphQLTypeHelper where TRepositoryImplementation : XBaseMongoRepository + where TGraphTypeHelperService : IXBaseGraphQLTypeHelper + where TGraphQuery : XBaseGraphQLQuery where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { // var isValid = repositoryDescriptor.IsValid(); @@ -746,7 +891,7 @@ namespace xDataService.Helpers if (isValid) { // - UseXGraphQL( + UseXGraphQL( source, repositoryDescriptor ); @@ -766,8 +911,7 @@ namespace xDataService.Helpers /// /// /// - /// - /// + /// /// /// /// @@ -775,9 +919,25 @@ namespace xDataService.Helpers /// /// /// - public static void UseXRepository( + public static void UseXRepository< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema, + TRepositoryService, + TRepositoryImplementation, + TContext + >( IApplicationBuilder source, - XEFRepositoryDescriptor repositoryDescriptor + XEFRepositoryDescriptor repositoryDescriptor ) where TGraphSchema : Schema where TContext : XDbContext @@ -790,10 +950,9 @@ namespace xDataService.Helpers where TEventsImplementation : XBaseRepositoryEvents where TKeyGeneratorImplementation : XKeyGenerator where TGraphTypeHelperService : IXBaseGraphQLTypeHelper + where TGraphQuery : XBaseGraphQLQuery where TRepositoryImplementation : XBaseEFRepository where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { // var isValid = repositoryDescriptor.IsValid(); @@ -808,7 +967,7 @@ namespace xDataService.Helpers if (isValid) { // - UseXGraphQL( + UseXGraphQL( source, repositoryDescriptor ); @@ -851,7 +1010,12 @@ namespace xDataService.Helpers /// /// /// - public static void AddXKeyGenerator( + public static void AddXKeyGenerator< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation + >( IServiceCollection source, XRepositoryDescriptor repositoryDescriptor, ServiceLifetime lifetime = ServiceLifetime.Scoped @@ -894,7 +1058,12 @@ namespace xDataService.Helpers /// /// /// - public static void AddXEvents( + public static void AddXEvents< + TEntity, + TKey, + TEventsService, + TEventsImplementation + >( IServiceCollection source, XRepositoryDescriptor repositoryDescriptor, ServiceLifetime lifetime = ServiceLifetime.Scoped @@ -936,13 +1105,21 @@ namespace xDataService.Helpers /// /// /// - /// - /// + /// /// /// /// /// - public static void AddXGraphQL( + public static void AddXGraphQL< + TEntity, + TKey, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema + >( IServiceCollection source, XRepositoryDescriptor repositoryDescriptor, ServiceLifetime lifetime = ServiceLifetime.Scoped @@ -952,9 +1129,8 @@ namespace xDataService.Helpers where TEntity : XBaseEntity where TGraph : XBaseGraphObjectType where TGraphTypeHelperService : IXBaseGraphQLTypeHelper + where TGraphQuery : XBaseGraphQLQuery where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { // // Validate ... @@ -962,32 +1138,16 @@ namespace xDataService.Helpers !source.IsNull() && !repositoryDescriptor.IsNull() && !repositoryDescriptor.GraphType.IsNull() && + !repositoryDescriptor.GraphQuery.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( @@ -1002,8 +1162,8 @@ namespace xDataService.Helpers // Register Graph Query ... source.Add( new ServiceDescriptor( - repositoryDescriptor.GraphQueryService, - repositoryDescriptor.GraphQueryImplementation, + repositoryDescriptor.GraphQuery, + repositoryDescriptor.GraphQuery, lifetime ) ); @@ -1017,6 +1177,41 @@ namespace xDataService.Helpers lifetime: ServiceLifetime.Singleton ) ); + + // + // Register Graph Type ... + source.Add( + new ServiceDescriptor( + repositoryDescriptor.GraphType, + repositoryDescriptor.GraphType, + ServiceLifetime.Singleton + ) + ); + + // + // Register Graph Events ... + source.Add( + new ServiceDescriptor( + typeof(XBaseGraphQLEventType), + typeof(XBaseGraphQLEventType), + ServiceLifetime.Singleton + ) + ); + + // + // Register Graph Type Schema ... + var builder = source.GetRegisteredService(); + if (builder.IsNull()) + { + // + Action options = x => { }; + builder = source.AddGraphQL(options) + .AddNewtonsoftJson(deserializerSettings => { }, serializerSettings => { }) + .AddWebSockets() + .AddDataLoader() + .AddGraphTypes(); + } + builder.AddGraphTypes(repositoryDescriptor.GraphSchema); } /// @@ -1029,13 +1224,21 @@ namespace xDataService.Helpers /// /// /// - /// - /// + /// /// /// /// /// - public static void UseXGraphQL( + public static void UseXGraphQL< + TEntity, + TKey, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema + >( IApplicationBuilder source, XRepositoryDescriptor repositoryDescriptor ) @@ -1044,9 +1247,8 @@ namespace xDataService.Helpers where TEntity : XBaseEntity where TGraph : XBaseGraphObjectType where TGraphTypeHelperService : IXBaseGraphQLTypeHelper + where TGraphQuery : XBaseGraphQLQuery where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { // // Validate ... @@ -1054,11 +1256,10 @@ namespace xDataService.Helpers !source.IsNull() && !repositoryDescriptor.IsNull() && !repositoryDescriptor.GraphType.IsNull() && + !repositoryDescriptor.GraphQuery.IsNull() && !repositoryDescriptor.GraphSchema.IsNull() && !repositoryDescriptor.GraphTypeKey.IsNull() && - !repositoryDescriptor.GraphQueryService.IsNull() && !repositoryDescriptor.GraphTypeHelperService.IsNull() && - !repositoryDescriptor.GraphQueryImplementation.IsNull() && !repositoryDescriptor.GraphTypeHelperImplementation.IsNull(); if (!isValid) { diff --git a/Models/XRepositoryDescriptor.cs b/Models/XRepositoryDescriptor.cs index 6fc01f7..48ed6e3 100644 --- a/Models/XRepositoryDescriptor.cs +++ b/Models/XRepositoryDescriptor.cs @@ -69,13 +69,7 @@ namespace xDataService.Models /// Entity GrapQL Query ... /// /// - public Type GraphQueryService { get; set; } = null; - - /// - /// Entity GrapQL Query ... - /// - /// - public Type GraphQueryImplementation { get; set; } = null; + public Type GraphQuery { get; set; } = null; /// /// Repository Event Provider ... @@ -133,7 +127,12 @@ namespace xDataService.Models /// /// a Repository Descriptor ... /// - public class XRepositoryDescriptor : XRepositoryDescriptor + public class XRepositoryDescriptor< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation + > : XRepositoryDescriptor where TEntity : XBaseEntity where TKeyGeneratorService : IXKeyGenerator where TKeyGeneratorImplementation : XKeyGenerator @@ -149,7 +148,19 @@ namespace xDataService.Models /// /// a Repository Descriptor ... /// - public class XRepositoryDescriptor : XRepositoryDescriptor + public class XRepositoryDescriptor< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation + > : XRepositoryDescriptor< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation + > where TEntity : XBaseEntity where TEventsService : IXBaseRepositoryEvents where TKeyGeneratorService : IXKeyGenerator @@ -167,7 +178,27 @@ namespace xDataService.Models /// /// a Repository Descriptor ... /// - public class XRepositoryDescriptor : XRepositoryDescriptor + public class XRepositoryDescriptor< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema + > : XRepositoryDescriptor< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation + > where TGraphSchema : Schema where TGraphKey : IGraphType where TEntity : XBaseEntity @@ -177,19 +208,17 @@ namespace xDataService.Models where TEventsImplementation : XBaseRepositoryEvents where TKeyGeneratorImplementation : XKeyGenerator where TGraphTypeHelperService : IXBaseGraphQLTypeHelper + where TGraphQuery : XBaseGraphQLQuery where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { public XRepositoryDescriptor() : base() { // GraphType = typeof(TGraph); GraphTypeKey = typeof(TGraphKey); + GraphQuery = typeof(TGraphQuery); GraphSchema = typeof(TGraphSchema); - GraphQueryService = typeof(TGraphQueryService); GraphTypeHelperService = typeof(TGraphTypeHelperService); - GraphQueryImplementation = typeof(TGraphQueryImplementation); GraphTypeHelperImplementation = typeof(TGraphTypeHelperImplementation); } } @@ -197,7 +226,35 @@ namespace xDataService.Models /// /// a Repository Descriptor ... /// - public class XInMemoryRepositoryDescriptor : XRepositoryDescriptor + public class XInMemoryRepositoryDescriptor< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema, + TRepositoryService, + TRepositoryImplementation + > : XRepositoryDescriptor< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema + > where TGraphSchema : Schema where TGraphKey : IGraphType where TEntity : XBaseEntity @@ -209,9 +266,8 @@ namespace xDataService.Models where TKeyGeneratorImplementation : XKeyGenerator where TGraphTypeHelperService : IXBaseGraphQLTypeHelper where TRepositoryImplementation : XBaseInMemoryRepositoy + where TGraphQuery : XBaseGraphQLQuery where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { public XInMemoryRepositoryDescriptor() : base() { @@ -224,7 +280,35 @@ namespace xDataService.Models /// /// a Repository Descriptor ... /// - public class XMongoRepositoryDescriptor : XRepositoryDescriptor + public class XMongoRepositoryDescriptor< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema, + TRepositoryService, + TRepositoryImplementation + > : XRepositoryDescriptor< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema + > where TGraphSchema : Schema where TGraphKey : IGraphType where TEntity : XBaseEntity @@ -236,9 +320,8 @@ namespace xDataService.Models where TKeyGeneratorImplementation : XKeyGenerator where TRepositoryImplementation : XBaseMongoRepository where TGraphTypeHelperService : IXBaseGraphQLTypeHelper + where TGraphQuery : XBaseGraphQLQuery where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { public XMongoRepositoryDescriptor() : base() { @@ -251,7 +334,36 @@ namespace xDataService.Models /// /// a Repository Descriptor ... /// - public class XEFRepositoryDescriptor : XRepositoryDescriptor + public class XEFRepositoryDescriptor< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema, + TRepositoryService, + TRepositoryImplementation, + TContext + > : XRepositoryDescriptor< + TEntity, + TKey, + TKeyGeneratorService, + TKeyGeneratorImplementation, + TEventsService, + TEventsImplementation, + TGraph, + TGraphKey, + TGraphQuery, + TGraphTypeHelperService, + TGraphTypeHelperImplementation, + TGraphSchema + > where TGraphSchema : Schema where TContext : XDbContext where TGraphKey : IGraphType @@ -263,10 +375,9 @@ namespace xDataService.Models where TEventsImplementation : XBaseRepositoryEvents where TKeyGeneratorImplementation : XKeyGenerator where TGraphTypeHelperService : IXBaseGraphQLTypeHelper + where TGraphQuery : XBaseGraphQLQuery where TRepositoryImplementation : XBaseEFRepository where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper - where TGraphQueryService : IXBaseGraphQLQuery - where TGraphQueryImplementation : XBaseGraphQLQuery { public XEFRepositoryDescriptor() : base() { diff --git a/Providers/XLongKeyGenerator.cs b/Providers/XLongKeyGenerator.cs new file mode 100644 index 0000000..3efc073 --- /dev/null +++ b/Providers/XLongKeyGenerator.cs @@ -0,0 +1,45 @@ +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using xCommons.Extensions; +using xDataService.Extensions; +using xDataService.Interfaces; +using xModels.Base; + +namespace xDataService.Providers +{ + /// + /// Default Long Key Generator ... + /// + /// + public class XLongKeyGenerator : XKeyGenerator, IXKeyGenerator + where TEntity : XBaseEntity + { + public override async Task GenerateKey( + IXBaseRepository repository, + CancellationToken cancellationToken = default + ) + { + // + var items = (await repository.GetAllAsync()) + .OrderByDescending(nameof(XBaseEntity.Id)); + var last = items + .FirstOrDefault(); + + // + var result = last.IsNull() ? 1 : last.Id + 1; + + // + return result; + } + + public override bool IsEmpty(long id) + { + // + var result = id <= 0; + + // + return result; + } + } +} \ No newline at end of file