From 52600e804c580c305bd4d931ea4814f745feb332 Mon Sep 17 00:00:00 2001 From: hchen2020 <101423@smsassist.com> Date: Fri, 21 Jul 2023 16:56:14 -0500 Subject: [PATCH] Support multiple database. --- .../Services/AgentService.CreateAgent.cs | 6 +-- .../Agents/Services/AgentService.GetAgents.cs | 4 +- .../Services/AgentService.UpdateAgent.cs | 4 +- .../BotSharpServiceCollectionExtensions.cs | 42 ++++++++----------- .../Services/ConversationService.cs | 10 ++--- .../{IAgentTable.cs => IBotSharpTable.cs} | 2 +- ...AgentDbContext.cs => BotSharpDbContext.cs} | 2 +- .../Repository/DataContextHelper.cs | 40 ++++++++++++------ .../Repository/DbTables/AgentRecord.cs | 2 +- .../Repository/DbTables/ConversationRecord.cs | 2 +- .../Repository/DbTables/UserRecord.cs | 2 +- .../Users/Services/UserService.cs | 10 ++--- 12 files changed, 67 insertions(+), 59 deletions(-) rename src/Infrastructure/BotSharp.Core/Repository/Abstraction/{IAgentTable.cs => IBotSharpTable.cs} (62%) rename src/Infrastructure/BotSharp.Core/Repository/{AgentDbContext.cs => BotSharpDbContext.cs} (85%) diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs index 8f1e70c6..0d9c21db 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs @@ -6,7 +6,7 @@ public partial class AgentService { public async Task CreateAgent(Agent agent) { - var db = _services.GetRequiredService(); + var db = _services.GetRequiredService(); var record = db.Agent.FirstOrDefault(x => x.OwnerId == _user.Id && x.Name == agent.Name); if (record != null) { @@ -19,9 +19,9 @@ public partial class AgentService record.CreatedDateTime = DateTime.UtcNow; record.UpdatedDateTime = DateTime.UtcNow; - db.Transaction(delegate + db.Transaction(delegate { - db.Add(record); + db.Add(record); }); return record.ToAgent(); diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.GetAgents.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.GetAgents.cs index cdbdf95b..27b5a2cf 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.GetAgents.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.GetAgents.cs @@ -7,7 +7,7 @@ public partial class AgentService { public async Task> GetAgents() { - var db = _services.GetRequiredService(); + var db = _services.GetRequiredService(); var query = from agent in db.Agent where agent.OwnerId == _user.Id select agent.ToAgent(); @@ -16,7 +16,7 @@ public partial class AgentService public async Task GetAgent(string id) { - var db = _services.GetRequiredService(); + var db = _services.GetRequiredService(); var query = from agent in db.Agent where agent.Id == id select agent.ToAgent(); diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs index 4f10598c..25723fcc 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.UpdateAgent.cs @@ -7,9 +7,9 @@ public partial class AgentService { public async Task UpdateAgent(Agent agent) { - var db = _services.GetRequiredService(); + var db = _services.GetRequiredService(); - db.Transaction(delegate + db.Transaction(delegate { var record = db.Agent.FirstOrDefault(x => x.OwnerId == agent.OwerId && x.Id == agent.Id); diff --git a/src/Infrastructure/BotSharp.Core/BotSharpServiceCollectionExtensions.cs b/src/Infrastructure/BotSharp.Core/BotSharpServiceCollectionExtensions.cs index 35ee23b2..1e02d17c 100644 --- a/src/Infrastructure/BotSharp.Core/BotSharpServiceCollectionExtensions.cs +++ b/src/Infrastructure/BotSharp.Core/BotSharpServiceCollectionExtensions.cs @@ -1,7 +1,6 @@ using BotSharp.Abstraction.Conversations.Settings; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; - namespace BotSharp.Core; public static class BotSharpServiceCollectionExtensions @@ -20,15 +19,29 @@ public static class BotSharpServiceCollectionExtensions services.AddScoped(); services.AddScoped(); - RegisterRepository(services, config); - RegisterPlugins(services, config); return services; } - public static void ConfigureBotSharp(this IServiceCollection services) + public static IServiceCollection ConfigureBotSharpRepository(this IServiceCollection services, IConfiguration config) + where Tdb : DataContext { + var databaseSettings = new DatabaseSettings(); + config.Bind("Database", databaseSettings); + services.AddSingleton((IServiceProvider x) => databaseSettings); + + var myDatabaseSettings = new MyDatabaseSettings(); + config.Bind("Database", myDatabaseSettings); + services.AddSingleton((IServiceProvider x) => databaseSettings); + + services.AddScoped((IServiceProvider x) + => DataContextHelper.GetDbContext(myDatabaseSettings, x)); + + services.AddScoped((IServiceProvider x) + => DataContextHelper.GetDbContext(myDatabaseSettings, x)); + + return services; } public static IApplicationBuilder UseBotSharp(this IApplicationBuilder app) @@ -43,27 +56,6 @@ public static class BotSharpServiceCollectionExtensions return app; } - public static void RegisterRepository(IServiceCollection services, IConfiguration config) - { - var databaseSettings = new DatabaseSettings(); - config.Bind("Database", databaseSettings); - services.AddSingleton((IServiceProvider x) => databaseSettings); - - var myDatabaseSettings = new MyDatabaseSettings(); - config.Bind("Database", myDatabaseSettings); - services.AddSingleton((IServiceProvider x) => databaseSettings); - - services.AddScoped((IServiceProvider x) => - { - return DataContextHelper.GetDbContext(myDatabaseSettings, x); - }); - - services.AddScoped((IServiceProvider x) => - { - return DataContextHelper.GetDbContext(myDatabaseSettings, x); - }); - } - public static void RegisterPlugins(IServiceCollection services, IConfiguration config) { var pluginSettings = new PluginLoaderSettings(); diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs index b7edd207..d07dc31f 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs @@ -30,7 +30,7 @@ public class ConversationService : IConversationService public async Task GetConversation(string id) { - var db = _services.GetRequiredService(); + var db = _services.GetRequiredService(); var query = from sess in db.Conversation where sess.Id == id orderby sess.CreatedTime descending @@ -40,7 +40,7 @@ public class ConversationService : IConversationService public async Task> GetConversations() { - var db = _services.GetRequiredService(); + var db = _services.GetRequiredService(); var query = from sess in db.Conversation where sess.UserId == _user.Id orderby sess.CreatedTime descending @@ -50,16 +50,16 @@ public class ConversationService : IConversationService public async Task NewConversation(Conversation sess) { - var db = _services.GetRequiredService(); + var db = _services.GetRequiredService(); var record = ConversationRecord.FromConversation(sess); record.Id = sess.Id.IfNullOrEmptyAs(Guid.NewGuid().ToString()); record.UserId = sess.UserId.IfNullOrEmptyAs(_user.Id); record.Title = "New Conversation"; - db.Transaction(delegate + db.Transaction(delegate { - db.Add(record); + db.Add(record); }); _storage.InitStorage(sess.AgentId, record.Id); diff --git a/src/Infrastructure/BotSharp.Core/Repository/Abstraction/IAgentTable.cs b/src/Infrastructure/BotSharp.Core/Repository/Abstraction/IBotSharpTable.cs similarity index 62% rename from src/Infrastructure/BotSharp.Core/Repository/Abstraction/IAgentTable.cs rename to src/Infrastructure/BotSharp.Core/Repository/Abstraction/IBotSharpTable.cs index 053aab71..2ea3383f 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/Abstraction/IAgentTable.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/Abstraction/IBotSharpTable.cs @@ -1,5 +1,5 @@ namespace BotSharp.Core.Repository.Abstraction; -public interface IAgentTable +public interface IBotSharpTable { } diff --git a/src/Infrastructure/BotSharp.Core/Repository/AgentDbContext.cs b/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs similarity index 85% rename from src/Infrastructure/BotSharp.Core/Repository/AgentDbContext.cs rename to src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs index a7dcdd31..98fa8eeb 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/AgentDbContext.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs @@ -1,6 +1,6 @@ namespace BotSharp.Core.Repository; -public class AgentDbContext : Database +public class BotSharpDbContext : Database { public IQueryable User => Table(); public IQueryable Agent => Table(); diff --git a/src/Infrastructure/BotSharp.Core/Repository/DataContextHelper.cs b/src/Infrastructure/BotSharp.Core/Repository/DataContextHelper.cs index 1b30a92d..4fa85feb 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/DataContextHelper.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/DataContextHelper.cs @@ -1,14 +1,14 @@ -using BotSharp.Core.Repository.Abstraction; -using EntityFrameworkCore.BootKit; using Microsoft.Data.SqlClient; +using MySqlConnector; using System.Data.Common; namespace BotSharp.Core.Repository; public static class DataContextHelper { - public static T GetDbContext(MyDatabaseSettings settings, IServiceProvider serviceProvider) + public static T GetDbContext(MyDatabaseSettings settings, IServiceProvider serviceProvider) where T : Database, new() + where Tdb : DataContext { if (settings.Assemblies == null) throw new Exception("Please set assemblies."); @@ -25,17 +25,33 @@ public static class DataContextHelper IsRelational = false }); } - else if (typeof(T) == typeof(AgentDbContext)) + else if (typeof(T) == typeof(BotSharpDbContext)) { - dc.BindDbContext(new DatabaseBind + if (typeof(Tdb).Name.StartsWith("DbContext4SqlServer")) { - ServiceProvider = serviceProvider, - MasterConnection = new SqlConnection(settings.BotSharp.Master), - SlaveConnections = settings.BotSharp.Slavers.Length == 0 ? - new List { new SqlConnection(settings.BotSharp.Master) } : - settings.BotSharp.Slavers.Select(x => new SqlConnection(x) as DbConnection).ToList(), - CreateDbIfNotExist = true - }); + dc.BindDbContext(new DatabaseBind + { + ServiceProvider = serviceProvider, + MasterConnection = new SqlConnection(settings.BotSharp.Master), + SlaveConnections = settings.BotSharp.Slavers.Length == 0 ? + new List { new SqlConnection(settings.BotSharp.Master) } : + settings.BotSharp.Slavers.Select(x => new SqlConnection(x) as DbConnection) + .ToList(), + CreateDbIfNotExist = true + }); + } + else if (typeof(Tdb).Name.StartsWith("DbContext4Aurora") || + typeof(Tdb).Name.StartsWith("DbContext4MySql")) + { + dc.BindDbContext(new DatabaseBind + { + ServiceProvider = serviceProvider, + MasterConnection = new MySqlConnection(settings.BotSharp.Master), + SlaveConnections = settings.BotSharp.Slavers + .Select(x => new MySqlConnection(x) as DbConnection).ToList(), + CreateDbIfNotExist = true + }); + } } return dc; } diff --git a/src/Infrastructure/BotSharp.Core/Repository/DbTables/AgentRecord.cs b/src/Infrastructure/BotSharp.Core/Repository/DbTables/AgentRecord.cs index eb5e3f42..99fd31b3 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/DbTables/AgentRecord.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/DbTables/AgentRecord.cs @@ -5,7 +5,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace BotSharp.Core.Repository.DbTables; [Table("Agent")] -public class AgentRecord : DbRecord, IAgentTable +public class AgentRecord : DbRecord, IBotSharpTable { [Required] [MaxLength(64)] diff --git a/src/Infrastructure/BotSharp.Core/Repository/DbTables/ConversationRecord.cs b/src/Infrastructure/BotSharp.Core/Repository/DbTables/ConversationRecord.cs index a3b75cc2..167f664d 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/DbTables/ConversationRecord.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/DbTables/ConversationRecord.cs @@ -5,7 +5,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace BotSharp.Core.Repository.DbTables; [Table("Conversation")] -public class ConversationRecord : DbRecord, IAgentTable +public class ConversationRecord : DbRecord, IBotSharpTable { [Required] [MaxLength(36)] diff --git a/src/Infrastructure/BotSharp.Core/Repository/DbTables/UserRecord.cs b/src/Infrastructure/BotSharp.Core/Repository/DbTables/UserRecord.cs index ab357436..88d8b51c 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/DbTables/UserRecord.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/DbTables/UserRecord.cs @@ -5,7 +5,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace BotSharp.Core.Repository.DbTables; [Table("User")] -public class UserRecord : DbRecord, IAgentTable +public class UserRecord : DbRecord, IBotSharpTable { [Required] [MaxLength(64)] diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs index 6acdf0f5..9d979168 100644 --- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs +++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs @@ -23,7 +23,7 @@ public class UserService : IUserService public async Task CreateUser(User user) { - var db = _services.GetRequiredService(); + var db = _services.GetRequiredService(); var record = db.User.FirstOrDefault(x => x.Email == user.Email.ToLower()); if (record != null) { @@ -36,9 +36,9 @@ public class UserService : IUserService record.Salt = Guid.NewGuid().ToString("N"); record.Password = Utilities.HashText(user.Password, record.Salt); - db.Transaction(delegate + db.Transaction(delegate { - db.Add(record); + db.Add(record); }); return record.ToUser(); @@ -49,7 +49,7 @@ public class UserService : IUserService var base64 = Encoding.UTF8.GetString(Convert.FromBase64String(authorization)); var (userEmail, password) = base64.SplitAsTuple(":"); - var db = _services.GetRequiredService(); + var db = _services.GetRequiredService(); var record = db.User.FirstOrDefault(x => x.Email == userEmail); if (record == null) { @@ -104,7 +104,7 @@ public class UserService : IUserService { var userId = _user.Id; - var db = _services.GetRequiredService(); + var db = _services.GetRequiredService(); var user = (from u in db.User where u.Id == userId select new User