Asp

Asp.Net Core(Ef Core+serilog+hangfire)实践

起因

在这周开始的时候,由于某个厂的数据库和服务器更换,由我负责的模块有10余个同步程序需要丢到新服务器上去,采用IIS的计划任务,就这样,一上午的时间差不多就消耗完了,中间还有人抢服务器用。我能不能把他们整合呢?

首先确认用什么,都2024了,肯定得用.net core,那用控制台还是asp.net 呢?

想起之前每次更改连接字符串还需要手动重新生成,再丢到服务器上,我想直接就在服务器上更改配置文件就行

于是,我想到了asp.net coreappsettings.json,直接写在配置文件里面

使用IConfiguration接口依赖注入:比如Configuration["DBConnectionString"]

技术栈选择:

EF Core:微软官方orm框架

serilog:开源.Net结构化日志框架

hangfire:开源.Net任务调度框架,简单易用,还有仪表盘

配置

builder.Services.AddDbContext<UdpDataZ1Context>(options =>
  options.UseSqlServer(builder.Configuration.GetConnectionString("EMSDb"))); //数据库

builder.Logging.ClearProviders();//删除所有记录器提供程序
builder.Host.UseSerilog((context, loggerConfiguration) =>
{
    loggerConfiguration.MinimumLevel.Debug()
    .WriteTo.Console()
    .WriteTo.Logger(lc => lc.Filter.ByIncludingOnly(e => e.Level >= LogEventLevel.Information)
    .WriteTo.File("logs/myapp.txt", rollingInterval: RollingInterval.Day));//Information级别及以上
});//使用Serilog日志替换微软自己的Logging

        services.AddHangfire(config => config
.UseSqlServerStorage(connectionStringsOptions.EMSDb));
        GlobalConfiguration.Configuration
.UseColouredConsoleLogProvider()
.UseSerilogLogProvider()
.UseSqlServerStorage(connectionStringsOptions.EMSDb)
.WithJobExpirationTimeout(TimeSpan.FromDays(7));//hangfire配置,这里我是给它封装了一个extesions类

app.UseHangfireDashboard("/jobs", new DashboardOptions
{
    Authorization = new[] { new MyAuthorizationFilter() },//验证
    DashboardTitle="设备管理及安灯系统同步程序"
});//仪表盘

实现

public class Job(IConfiguration configuration,
    IEquipmentNotification equipmentNotification
    ) : IJob//C#12 新增的主构造函数
{

    private readonly IConfiguration Configuration = configuration;
    private readonly IEquipmentNotification EqNotificationService = equipmentNotification;
    public async Task RunJob()
    { 
        ///通知
        RecurringJob.AddOrUpdate("安灯报警通知", () => EqNotificationService.MainAlarms(), Cron.Minutely, TimeZoneInfo.Local);
        RecurringJob.AddOrUpdate("维护通知", () => EqNotificationService.MaintenanceTasksNotification(), "0 0 8 * * ? ", TimeZoneInfo.Local);
        RecurringJob.AddOrUpdate("安灯升级通知", () => EqNotificationService.UpgradeNotification(), "0 0/5 0/1 * * ? ", TimeZoneInfo.Local);
    }
}
//这里是program.cs类,直接从服务容器中获取
using (var serviceScope = app.Services.CreateScope())
{
    var services = serviceScope.ServiceProvider;
    var jobService = services.GetRequiredService<IJob>();
   await jobService.RunJob();
    }

结果

其他

var data = _dbcontext.Tables.Include(a => a.SecondTables);//ef core 导航查询
var data = _dbcontext.Tables.FromSql($"select *  FROM table");//ef core sql查询
var data = _dbcontext.Database.SqlQuery<int>($"select ID  FROM table");//ef core 查询非实体标量类型

_logger.LogInformation("将加入DV_Emp:{@data}",Object);//采用结构化而非字符串拼接

private HttpClient client = httpClientFactory.CreateClient();//依赖注入httpClientFactory接口创建client

待优化

1.将日志输出到ElaticSearchseq而不是传统的输出到某个记事本文件

2.报警通知应当是实时性的,使用Signalr Core实现实时通知

posted @ 2024-04-14 19:55  ssz0312  阅读(2)  评论(0编辑  收藏  举报