Asp.Net Core(Ef Core+serilog+hangfire)实践
Asp.Net Core(Ef Core+serilog+hangfire)实践
起因
在这周开始的时候,由于某个厂的数据库和服务器更换,由我负责的模块有10余个同步程序需要丢到新服务器上去,采用IIS的计划任务,就这样,一上午的时间差不多就消耗完了,中间还有人抢服务器用。我能不能把他们整合呢?
首先确认用什么,都2024了,肯定得用.net core,那用控制台还是asp.net 呢?
想起之前每次更改连接字符串还需要手动重新生成,再丢到服务器上,我想直接就在服务器上更改配置文件就行
于是,我想到了asp.net core
的appsettings.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.将日志输出到ElaticSearch
或seq
而不是传统的输出到某个记事本文件
2.报警通知应当是实时性的,使用Signalr Core
实现实时通知
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)