using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using MongoDB.Bson.Serialization.Conventions; using xCommons.Extensions; using xDataService.Configuration; using xDataService.Constants; using xDataService.Db; using xDataService.DI; using xDataService.Interfaces; namespace xDataService.Models { /// /// Data Base Descriptor ... /// public abstract class XDatabaseDescriptor : IXDatabaseDescriptor { // #region Props ... /// /// Database Name ... /// /// public virtual string Name { get; set; } /// /// Database Provider ... /// /// public virtual XDbProviders Provider { get; set; } /// /// Db Context... /// /// public virtual Type Context { get; set; } = null; /// /// Database Connecion String ... /// /// public virtual string ConnectionString { get; set; } /// /// Data Service Configuration ... /// /// public virtual XDataBaseConfiguration Configuration { get; set; } /// /// Repositories Descriptions ... /// /// public virtual IList Repositories { get; set; } = null; /// /// Mongo Convention Packs ... /// public ConventionPack ConventionPacks { get; set; } = null; /// /// DbContext Options Builder ... /// /// public Action OptionsBuilder { get; set; } = null; #endregion // #region Constructor ... /// /// Constructor of Descriptor ... /// /// /// /// public XDatabaseDescriptor( string name, IList repositories = null ) { // Name = name; Repositories = repositories; } #endregion // #region Configure ... /// /// Configure Database Descriptor using Registered Services ... /// /// public void Configure( IServiceCollection services ) { // bool isValid = !Name.IsNullOrEmpty(); if (!isValid) { return; } // var xDataServiceConfiguration = services.GetRegisteredService(); isValid = !xDataServiceConfiguration.IsNullOrDefault() && xDataServiceConfiguration.Databases.HasChild() && xDataServiceConfiguration.Databases.Keys.Any(k => k == Name); if (!isValid) { return; } // var database = xDataServiceConfiguration.Databases[Name]; isValid = !database.IsNullOrDefault(); if (!isValid) { return; } // Configure(database); } /// /// Configure Database Descriptor using IConfiguration ... /// /// public void Configure( IConfiguration configuration ) { // bool isValid = !Name.IsNullOrEmpty(); if (!isValid) { return; } // var xDataServiceConfiguration = configuration.GetXDataServiceConfiguration(); isValid = !xDataServiceConfiguration.IsNullOrDefault() && xDataServiceConfiguration.Databases.HasChild() && xDataServiceConfiguration.Databases.Keys.Any(k => k == Name); if (!isValid) { return; } // var database = xDataServiceConfiguration.Databases[Name]; isValid = !database.IsNullOrDefault(); if (!isValid) { return; } // Configure(database); } /// /// Configure Database Descriptor using Database Configuration ... /// /// public void Configure( XDataBaseConfiguration configuration ) { // Configuration = configuration; Provider = configuration.Provider; ConnectionString = configuration.ConnectionString; } /// /// Configure Database Descriptor using Provider and Connection String ... /// /// /// public void Configure( XDbProviders provider, string connectionString ) { // Provider = provider; ConnectionString = connectionString; Configuration = new XDataBaseConfiguration { Provider = provider, ConnectionString = connectionString }; } #endregion } /// /// Data Base Descriptor ... /// /// public abstract class XDatabaseDescriptor : XDatabaseDescriptor, IXDatabaseDescriptor where TContext : XDbContext { /// /// Constructor of Descriptor ... /// /// /// /// /// public XDatabaseDescriptor( string name, IList repositories = null ) : base( name: name, repositories: repositories ) { Context = typeof(TContext); } } }