文件内容 StartHostedService.cs 8 KB 8806 字符
using ExampleForm.Handler;
using ExampleForm.usermodels;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using PasteApeart;
using PasteApeart.Application.Contracts;
using PasteApeart.Handler;
using PasteApeart.Handler.Extensions;
using PasteApeart.Handler.rabbit;

namespace ExampleForm
{
    /// <summary>
    /// 系统初始化
    /// </summary>
    public class StartHostedService : IHostedService, IAsyncDisposable
    {

        private readonly IServiceProvider _serviceProvider;
        private readonly ILogger<StartHostedService> _logger;
        private readonly IChannelHelper _channelHelper;
        private readonly IEventActionHandler _eventHandler;
        private readonly AppConfig _config;
        private IRabbitMultiConsumerHandler _rabbitReviceHandler;
        private readonly RabbitConfig _rabbitConfig;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="serviceProvider"></param>
        /// <param name="rabbitConfig"></param>
        /// <param name="logger"></param>
        /// <param name="channelHelper"></param>
        /// <param name="eventHandler"></param>
        /// <param name="config"></param>
        public StartHostedService(IServiceProvider serviceProvider, IOptions<RabbitConfig> rabbitConfig, ILogger<StartHostedService> logger, IChannelHelper channelHelper, IEventActionHandler eventHandler, IOptions<AppConfig> config)
        {
            _serviceProvider = serviceProvider;
            _logger = logger;
            _channelHelper = channelHelper;
            _eventHandler = eventHandler;
            _config = config.Value;
            _rabbitConfig = rabbitConfig.Value;
        }

        /// <summary>
        /// 
        /// </summary>
        private CancellationTokenSource cts = new CancellationTokenSource();

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="System.NotImplementedException"></exception>
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            if (_rabbitConfig.SubscribeEnable && _config.RabbitQueue)
            {
                var appclient = "default";
                if (Environment.GetEnvironmentVariable("APPID") != null)
                {
                    appclient = Environment.GetEnvironmentVariable("APPID");
                }
                //这个RabbitConfig到底是不是单例... .. . 
                _rabbitConfig.SubscribeQueue = $"Ud_Subscribe_{appclient}";
                Console.WriteLine($"配置了广播模式,设置的当前队列名称为:{_rabbitConfig.SubscribeQueue}");
                //下发将进行 消费者初始化
            }

            //await InitAuditDataUpdateAsync();

            await SystemInitMigrationUpdateAsync();

            if (!_config.RabbitQueue)
            {
                _ = ReahChannelEventModelAsync(cts.Token);
            }
            else
            {
                _rabbitReviceHandler = _serviceProvider.GetRequiredService<IRabbitMultiConsumerHandler>();
                //启动rabbitmq的消费者
                _ = _rabbitReviceHandler.InitAsync();
            }
            //Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} StartHostedService.StartAsync!");
        }

        /// <summary>
        /// 初始化系统
        /// </summary>
        private async Task SystemInitMigrationUpdateAsync()
        {
            //await Task.Delay(3000);

            try
            {

                using var _scope = _serviceProvider.CreateScope();
                using var _dbContext = _scope.ServiceProvider.GetRequiredService<IExampleFormDbContext>();

                if (_dbContext.Database.GetPendingMigrations().Any())
                {
                    await _dbContext.Database.MigrateAsync();
                }

                var configValue = _scope.ServiceProvider.GetRequiredService<IOptions<AppConfig>>();

                var config = configValue.Value;

                //创建基础角色 下面最好用事务来做
                var adminid = 0;
                var admin = await _dbContext.UserInfo.Where(x => x.Email == config.RootAccount).OrderByDescending(x => x.Id).AsNoTracking().FirstOrDefaultAsync();
                if (admin == null || admin == default)
                {

                    try
                    {
                        await _dbContext.Database.BeginTransactionAsync();
                        var one = new UserInfo();
                        one.Email = config.RootAccount;
                        one.UserName = "管理员";
                        one.CreateDate = DateTime.Now;
                        //one.Grade = "admin";
                        one.IsEnable = true;
                        one.PassWord = $"{config.RootPassword}".ToMd5Lower();
                        //one.GradeId = 1;
                        _dbContext.Add(one);
                        await _dbContext.SaveChangesAsync();
                        adminid = one.Id;

                        //var _handler = _scope.ServiceProvider.GetRequiredService<UserHandler>();

                        //创建组
                        var item = new GradeInfo
                        {
                            Name = "超管",
                            Code = "root",
                            Desc = "管理组",
                            IsEnable = true
                        };
                        _dbContext.Add(item);
                        await _dbContext.SaveChangesAsync();
                        var groupid = item.Id;
                        _dbContext.Add(new UserGrade() { GradeId = groupid, UserId = adminid });
                        await _dbContext.SaveChangesAsync();

                        await RoleBackLoadHandler.LoadAsync(_dbContext, false);
                        await _dbContext.Database.CommitTransactionAsync();
                    }
                    catch (Exception exlinit)
                    {
                        await _dbContext.Database.RollbackTransactionAsync();
                        _logger.LogException(exlinit);
                        throw;
                    }
                }
                else
                {
                    adminid = admin.Id;
                }
                //_dbContext.Dispose();
                //_scope.Dispose();
            }
            catch (Exception exl)
            {
                _logger.LogError(exl.ToString());
                throw;
            }
        }

        ///// <summary>
        ///// 初始化审计日志的数据库等
        ///// </summary>
        ///// <returns></returns>
        //private async Task InitAuditDataUpdateAsync()
        //{
        //    try
        //    {
        //        using var sc = _serviceProvider.CreateScope();
        //        using var _dbContext = sc.ServiceProvider.GetRequiredService<MyAuditingDb>();
        //        if (_dbContext.Database.GetPendingMigrations().Any())
        //        {
        //            await _dbContext.Database.MigrateAsync();
        //        }

        //    }
        //    catch (Exception exl)
        //    {
        //        _logger.LogException(exl);
        //    }
        //}

        /// <summary>
        /// 处理Channel中的EventModel
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        private async Task ReahChannelEventModelAsync(CancellationToken token = default)
        {
            try
            {
                while (!token.IsCancellationRequested)
                {
                    var read = await _channelHelper.ChannelEventModel.Reader.ReadAsync(token);
                    if (read != null)
                    {
                        await _eventHandler.ActionMessageAsync(read);
                    }
                    else
                    {
                        await Task.Delay(500);
                    }
                }
            }
            catch (Exception exl)
            {
                _logger.LogException(exl);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="System.NotImplementedException"></exception>
        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
            //throw new System.NotImplementedException();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public async ValueTask DisposeAsync()
        {
            await cts.CancelAsync();

            if (_rabbitReviceHandler != null)
            {
                await _rabbitReviceHandler.DisposeAsync();
            }
            await Task.Delay(500);
        }
    }
}
​ ​