Compare commits
1
Commits
657530b394
...
2b17be0575
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b17be0575 |
@@ -0,0 +1,196 @@
|
||||
using GraphQL.Types;
|
||||
using xDataService.Db;
|
||||
using xDataService.GraphQL;
|
||||
using xDataService.Interfaces;
|
||||
using xDataService.Models;
|
||||
using xDataService.Providers;
|
||||
using xModels.Base;
|
||||
|
||||
namespace xDataService.Builders
|
||||
{
|
||||
/// <summary>
|
||||
/// Fluent Builder for constructing XRepositoryDescriptor instances.
|
||||
/// Replaces the telescoping generic constructors (12-17 type parameters)
|
||||
/// with a readable, chainable API.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">The entity type</typeparam>
|
||||
/// <typeparam name="TKey">The entity key type</typeparam>
|
||||
/// <example>
|
||||
/// var descriptor = XRepositoryDescriptor.For<XAiMessage, Guid>()
|
||||
/// .WithKeyGenerator<IXAiMessageKeyGenerator, XAiMessageKeyGenerator>()
|
||||
/// .WithEvents<IXAiMessageRepositoryEvents, XAiMessageRepositoryEvents>()
|
||||
/// .WithGraphQL<XAiMessageGraphType, GuidGraphType, XAiMessageGraphQuery,
|
||||
/// IXAiMessageGraphQLTypeHelper, XAiMessageGraphQLTypeHelper, XAiMessageGraphSchema>()
|
||||
/// .WithEFRepository<XAiApiDbContext, IXAiMessageRepository, XAiMessageEFRepository<XAiApiDbContext>>()
|
||||
/// .WithSeeder<IXAiMessageSeeder, XAiMessageSeeder>()
|
||||
/// .Build();
|
||||
/// </example>
|
||||
public sealed class XRepositoryDescriptorBuilder<TEntity, TKey>
|
||||
where TEntity : XBaseEntity<TKey>
|
||||
{
|
||||
private readonly XRepositoryDescriptor _descriptor;
|
||||
|
||||
private XRepositoryDescriptorBuilder()
|
||||
{
|
||||
_descriptor = new XRepositoryDescriptor
|
||||
{
|
||||
Entity = typeof(TEntity),
|
||||
Key = typeof(TKey)
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new builder instance for the specified entity and key types.
|
||||
/// </summary>
|
||||
public static XRepositoryDescriptorBuilder<TEntity, TKey> Create()
|
||||
{
|
||||
return new XRepositoryDescriptorBuilder<TEntity, TKey>();
|
||||
}
|
||||
|
||||
//
|
||||
#region KeyGenerator
|
||||
/// <summary>
|
||||
/// Configures the Key Generator service for the entity.
|
||||
/// </summary>
|
||||
/// <typeparam name="TKeyGeneratorService">The key generator interface</typeparam>
|
||||
/// <typeparam name="TKeyGeneratorImplementation">The key generator implementation</typeparam>
|
||||
public XRepositoryDescriptorBuilder<TEntity, TKey> WithKeyGenerator<TKeyGeneratorService, TKeyGeneratorImplementation>()
|
||||
where TKeyGeneratorService : IXKeyGenerator<TEntity, TKey>
|
||||
where TKeyGeneratorImplementation : XKeyGenerator<TEntity, TKey>
|
||||
{
|
||||
_descriptor.KeyGeneratorService = typeof(TKeyGeneratorService);
|
||||
_descriptor.KeyGeneratorImplementation = typeof(TKeyGeneratorImplementation);
|
||||
return this;
|
||||
}
|
||||
#endregion
|
||||
|
||||
//
|
||||
#region Events
|
||||
/// <summary>
|
||||
/// Configures the Repository Events service for the entity.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEventsService">The events interface</typeparam>
|
||||
/// <typeparam name="TEventsImplementation">The events implementation</typeparam>
|
||||
public XRepositoryDescriptorBuilder<TEntity, TKey> WithEvents<TEventsService, TEventsImplementation>()
|
||||
where TEventsService : IXBaseRepositoryEvents<TEntity>
|
||||
where TEventsImplementation : XBaseRepositoryEvents<TEntity>
|
||||
{
|
||||
_descriptor.EventsService = typeof(TEventsService);
|
||||
_descriptor.EventsImplementation = typeof(TEventsImplementation);
|
||||
return this;
|
||||
}
|
||||
#endregion
|
||||
|
||||
//
|
||||
#region GraphQL
|
||||
/// <summary>
|
||||
/// Configures the full GraphQL stack for the entity.
|
||||
/// </summary>
|
||||
/// <typeparam name="TGraph">The GraphQL object type</typeparam>
|
||||
/// <typeparam name="TGraphKey">The GraphQL key type</typeparam>
|
||||
/// <typeparam name="TGraphQuery">The GraphQL query type</typeparam>
|
||||
/// <typeparam name="TGraphTypeHelperService">The GraphQL type helper interface</typeparam>
|
||||
/// <typeparam name="TGraphTypeHelperImplementation">The GraphQL type helper implementation</typeparam>
|
||||
/// <typeparam name="TGraphSchema">The GraphQL schema</typeparam>
|
||||
public XRepositoryDescriptorBuilder<TEntity, TKey> WithGraphQL<
|
||||
TGraph,
|
||||
TGraphKey,
|
||||
TGraphQuery,
|
||||
TGraphTypeHelperService,
|
||||
TGraphTypeHelperImplementation,
|
||||
TGraphSchema>()
|
||||
where TGraphSchema : Schema
|
||||
where TGraphKey : IGraphType
|
||||
where TGraph : XBaseGraphObjectType<TEntity, TKey>
|
||||
where TGraphTypeHelperService : IXBaseGraphQLTypeHelper<TEntity, TKey>
|
||||
where TGraphQuery : XBaseGraphQLQuery<TEntity, TKey, TGraph, TGraphKey>
|
||||
where TGraphTypeHelperImplementation : XBaseGraphQLTypeHelper<TEntity, TKey>
|
||||
{
|
||||
_descriptor.GraphType = typeof(TGraph);
|
||||
_descriptor.GraphTypeKey = typeof(TGraphKey);
|
||||
_descriptor.GraphQuery = typeof(TGraphQuery);
|
||||
_descriptor.GraphSchema = typeof(TGraphSchema);
|
||||
_descriptor.GraphTypeHelperService = typeof(TGraphTypeHelperService);
|
||||
_descriptor.GraphTypeHelperImplementation = typeof(TGraphTypeHelperImplementation);
|
||||
return this;
|
||||
}
|
||||
#endregion
|
||||
|
||||
//
|
||||
#region Repository
|
||||
/// <summary>
|
||||
/// Configures an Entity Framework Core repository for the entity.
|
||||
/// </summary>
|
||||
/// <typeparam name="TContext">The EF DbContext</typeparam>
|
||||
/// <typeparam name="TRepositoryService">The repository interface</typeparam>
|
||||
/// <typeparam name="TRepositoryImplementation">The repository implementation</typeparam>
|
||||
public XRepositoryDescriptorBuilder<TEntity, TKey> WithEFRepository<TContext, TRepositoryService, TRepositoryImplementation>()
|
||||
where TContext : XDbContext
|
||||
where TRepositoryService : IXBaseRepository<TEntity, TKey>
|
||||
where TRepositoryImplementation : XBaseEFRepository<TEntity, TKey, TContext>
|
||||
{
|
||||
_descriptor.Context = typeof(TContext);
|
||||
_descriptor.RepositoryService = typeof(TRepositoryService);
|
||||
_descriptor.RepositoryImplementation = typeof(TRepositoryImplementation);
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configures a MongoDB repository for the entity.
|
||||
/// </summary>
|
||||
/// <typeparam name="TRepositoryService">The repository interface</typeparam>
|
||||
/// <typeparam name="TRepositoryImplementation">The repository implementation</typeparam>
|
||||
public XRepositoryDescriptorBuilder<TEntity, TKey> WithMongoRepository<TRepositoryService, TRepositoryImplementation>()
|
||||
where TRepositoryService : IXBaseRepository<TEntity, TKey>
|
||||
where TRepositoryImplementation : XBaseMongoRepository<TEntity, TKey>
|
||||
{
|
||||
_descriptor.RepositoryService = typeof(TRepositoryService);
|
||||
_descriptor.RepositoryImplementation = typeof(TRepositoryImplementation);
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configures an In-Memory repository for the entity.
|
||||
/// </summary>
|
||||
/// <typeparam name="TRepositoryService">The repository interface</typeparam>
|
||||
/// <typeparam name="TRepositoryImplementation">The repository implementation</typeparam>
|
||||
public XRepositoryDescriptorBuilder<TEntity, TKey> WithInMemoryRepository<TRepositoryService, TRepositoryImplementation>()
|
||||
where TRepositoryService : IXBaseRepository<TEntity, TKey>
|
||||
where TRepositoryImplementation : XBaseInMemoryRepository<TEntity, TKey>
|
||||
{
|
||||
_descriptor.RepositoryService = typeof(TRepositoryService);
|
||||
_descriptor.RepositoryImplementation = typeof(TRepositoryImplementation);
|
||||
return this;
|
||||
}
|
||||
#endregion
|
||||
|
||||
//
|
||||
#region Seeder
|
||||
/// <summary>
|
||||
/// Configures the database seeder for the entity.
|
||||
/// </summary>
|
||||
/// <typeparam name="TSeederService">The seeder interface</typeparam>
|
||||
/// <typeparam name="TSeederImplementation">The seeder implementation</typeparam>
|
||||
public XRepositoryDescriptorBuilder<TEntity, TKey> WithSeeder<TSeederService, TSeederImplementation>()
|
||||
where TSeederService : IXBaseDbSeeder<TEntity, TKey>
|
||||
where TSeederImplementation : XBaseDbSeeder<TEntity, TKey>
|
||||
{
|
||||
_descriptor.SeederService = typeof(TSeederService);
|
||||
_descriptor.SeederImplementation = typeof(TSeederImplementation);
|
||||
return this;
|
||||
}
|
||||
#endregion
|
||||
|
||||
//
|
||||
#region Build
|
||||
/// <summary>
|
||||
/// Builds and returns the configured XRepositoryDescriptor.
|
||||
/// </summary>
|
||||
/// <returns>The fully configured descriptor</returns>
|
||||
public XRepositoryDescriptor Build()
|
||||
{
|
||||
return _descriptor;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user