Это мой код:
- program.cs
builder.Services.AddHostedService();
builder.Services.AddScoped();
- Тревога
public class Alarm : IHostedService, IDisposable
{
private readonly MqttFactory mqttFactory;
private readonly MqttBrokerOptions? _mqttBrokerOptions;
private readonly IoTDbContext _context;
private readonly RabbitMQSet _rabbitMQSet;
private readonly IDbContextFactory _dbContextFactory;
private readonly IMapper _mapper;
private AlarmHnadler alarmHandler;
private readonly IServiceScopeFactory _serviceScopeFactory;
private IModel? _channel { get; set; }
private readonly RedisUtils _redisUtils;
public Alarm(IModel channel, IOptions mqttBrokerOptions, IConfiguration configuration,
SmsClient smsClient, VoiceMessagingService voiceMessagingService,
IDbContextFactory dbContextFactory, IMapper mapper,
IHubContext hubContext,IServiceScopeFactory serviceScopeFactory)
{
mqttFactory = new MqttFactory();
_mqttBrokerOptions = mqttBrokerOptions.Value;
_dbContextFactory = dbContextFactory;
_context = dbContextFactory.CreateDbContext();
_channel = channel;
_mapper = mapper;
_redisUtils = new RedisUtils(configuration, _context, _mapper);
_serviceScopeFactory = serviceScopeFactory;
using (var scope = _serviceScopeFactory.CreateScope())
{
alarmHandler = scope.ServiceProvider.GetRequiredService();
}
}
public async Task StartAsync(CancellationToken cancellationToken)
{
var userName = "Server";
var password = "123456".AESEncrypt(mode: CipherMode.ECB, padding: PaddingMode.Zeros, base64: false);
var mqttClientOptions = new MqttClientOptionsBuilder()
.WithTcpServer(_mqttBrokerOptions?.Host, _mqttBrokerOptions?.Port)
.WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V500)
.WithCredentials(userName, password)
.WithCleanSession()
.Build();
MqttSet.Client = mqttFactory.CreateMqttClient();
MqttSet.Client.ConnectedAsync += Client_ConnectedAsync;
MqttSet.Client.DisconnectedAsync += Client_DisconnectedAsync;
MqttSet.Client.ApplicationMessageReceivedAsync += Client_ApplicationMessageReceivedAsync;
await MqttSet.Client.ConnectAsync(mqttClientOptions, CancellationToken.None);
await alarmHandler.InitRedis("setting");
}
c#
public class AlarmHnadler : ControllerBase
{
private readonly IConfiguration _configuration;
private readonly SmsClient _smsClient;
private readonly VoiceMessagingService _voiceMessagingService;
private readonly IoTDbContext _context;
private readonly IDbContextFactory _dbContextFactory;
private readonly IMapper _mapper;
private readonly IDatabase _redisDB;
private readonly AlarmUtils _alarmUtil;
private readonly RedisUtils _redisUtils;
private Dictionary gatewaytAlarmDict { get; set; }
private readonly IHubContext _hubContext;
private IModel? _channel { get; set; }
public IBatch batch { get; set; }
public AlarmHnadler(IModel channel, IDbContextFactory dbContextFactory,
IConfiguration configuration, IHubContext hubContext,
IMapper mapper, SmsClient smsClient, VoiceMessagingService voiceMessagingService)
{
_configuration = configuration;
_dbContextFactory = dbContextFactory;
_alarmUtil = new AlarmUtils(_configuration);
var settingValue = _configuration["RedisDb"];
_channel = channel;
int.TryParse(settingValue, out int result);
_redisDB = RedisClient.GetDatabase(result);
_context = dbContextFactory.CreateDbContext();
_smsClient = smsClient;
_voiceMessagingService = voiceMessagingService;
_mapper = mapper;
gatewaytAlarmDict = new Dictionary();
_hubContext = hubContext;
setGatewayAlarmDictValue();
batch = _redisDB.CreateBatch();
_redisUtils = new RedisUtils(_configuration, _context, _mapper);
}
public async Task InitRedis(string tableName)
{
switch (tableName)
{
case "setting":
batch.KeyDeleteAsync("setting");
var alarmPointSettings =
await _context.Set().Where(a => a.Status == 1).ToListAsync();
var result =
_mapper.Map(alarmPointSettings);
var settingR = result.Select(item => JsonConvert.SerializeObject(item))
.Select((json, index) => new { Id = alarmPointSettings[index].Id.ToString(), Json = json })
.ToList();
foreach (var r in settingR)
{
batch.HashSetAsync("setting", r.Id, r.Json);
}
batch.Execute();
break;
}
Если бы вы могли помочь мне решить эту проблему, я был бы очень признателен.
Я больше не внедряю контекст напрямую; вместо этого я использую ContextFactory для его создания. Я думаю, что эта проблема была решена. Но я не знаю, почему. Область, обведенная красным на изображении ниже, является моей модификацией.
введите здесь описание изображения
ps :Изначально я не использовал внедрение зависимостей; вместо этого я напрямую создавал экземпляры объектов (используя «new»), что тоже сработало. Вот так
c#
// alarmHandler = new AlarmHnadler(_channel, _dbContextFactory, configuration, hubContext,
// _context, _mapper, smsClient, voiceMessagingService);
Подробнее здесь: https://stackoverflow.com/questions/786 ... t-instance