MainDbService.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using EVCB_OCPP.Domain.ConnectionFactory;
  2. using EVCB_OCPP.Domain;
  3. using EVCB_OCPP.Domain.Models.MainDb;
  4. using Microsoft.Extensions.Logging;
  5. using EVCB_OCPP.DBAPI.Helper;
  6. using Microsoft.EntityFrameworkCore.Internal;
  7. using Microsoft.EntityFrameworkCore;
  8. using System.Diagnostics.CodeAnalysis;
  9. namespace EVCB_OCPP.DBAPI.Services.DbService;
  10. public interface IMainDbService
  11. {
  12. Task<string> AddServerMessage(ServerMessage message, CancellationToken token = default);
  13. }
  14. public class MainDbService : IMainDbService
  15. {
  16. public MainDbService(
  17. ISqlConnectionFactory<MainDBContext> sqlConnectionFactory,
  18. IDbContextFactory<MainDBContext> contextFactory,
  19. ILogger<MainDbService> logger,
  20. ILoggerFactory loggerFactory)
  21. {
  22. this.sqlConnectionFactory = sqlConnectionFactory;
  23. this.contextFactory = contextFactory;
  24. this.logger = logger;
  25. this.loggerFactory = loggerFactory;
  26. InitAddServerMessageHandler();
  27. }
  28. private readonly IDbContextFactory<MainDBContext> contextFactory;
  29. private readonly ILogger<MainDbService> logger;
  30. private readonly ILoggerFactory loggerFactory;
  31. private readonly ISqlConnectionFactory<MainDBContext> sqlConnectionFactory;
  32. private GroupHandler<ServerMessage, string> addServerMessageHandler;
  33. public Task<string> AddServerMessage(ServerMessage message, CancellationToken token = default)
  34. {
  35. message.Id = 0;
  36. return addServerMessageHandler.HandleAsync(message, token);
  37. }
  38. [MemberNotNull(nameof(addServerMessageHandler))]
  39. private void InitAddServerMessageHandler()
  40. {
  41. if (addServerMessageHandler is not null)
  42. {
  43. throw new Exception($"{nameof(InitAddServerMessageHandler)} should only called once");
  44. }
  45. addServerMessageHandler = new GroupHandler<ServerMessage, string>(
  46. handleFunc: BundleAddServerMessage,
  47. logger: loggerFactory.CreateLogger("AddServerMessageHandler"));
  48. }
  49. private async Task BundleAddServerMessage(BundleHandlerData<ServerMessage, string> bundleHandlerData)
  50. {
  51. using var db = await contextFactory.CreateDbContextAsync();
  52. using var trans = await db.Database.BeginTransactionAsync();
  53. foreach (var message in bundleHandlerData.Datas)
  54. {
  55. await db.ServerMessage.AddAsync(message);
  56. }
  57. await db.SaveChangesAsync();
  58. await trans.CommitAsync();
  59. bundleHandlerData.CompletedDatas.AddRange(bundleHandlerData.Datas.Select(x => new KeyValuePair<ServerMessage, string>(x, x.SerialNo)));
  60. }
  61. }