关注墨瑾轩,带你探索编程的奥秘!
超萌技术攻略,轻松晋级编程高手
技术宝库已备好,就等你来挖掘
订阅墨瑾轩,智趣学习不孤单
即刻启航,编程之旅更有趣
现象:你可能经历过——前3步需求分析和架构设计顺利,但到第4步“审计日志”时,程序直接“翻车”:
真相:95%开发者的问题出在 “审计日志设计” 和 “状态机管理”!
痛点:依赖库混乱,代码像“拼七巧板”!
解决方案:用 Entity Framework Core(数据库) + MediatR(事件驱动) + Serilog(日志审计),打造“合规三件套”!
// 代码1:NuGet依赖配置(附注释)
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0" /> <!-- 数据库 -->
<PackageReference Include="MediatR" Version="12.0.1" /> <!-- 事件管道 -->
<PackageReference Include="Serilog" Version="2.11.0" /> <!-- 审计日志 -->
为什么有效?
痛点:产品状态混乱,像“西游记”取经路上“九九八十一变”!
解决方案:用 State Pattern(状态模式) + GuardClauses(权限校验),打造“合规剧本”!
// 代码2:状态机核心类(附注释)
public class ProductStateMachine
{
private Product _product;
public ProductStateMachine(Product product)
{
_product = product;
}
// 状态转换(示例:从“设计”到“测试”)
public void TransitionToTesting()
{
if (_product.Status != ProductStatus.Design)
throw new InvalidOperationException("只能从设计状态转测试!");
// 权限校验(关键!)
if (!UserHasPermission("TESTING_APPROVAL"))
throw new UnauthorizedAccessException("您没有权限!");
_product.Status = ProductStatus.Testing;
_product.LastModified = DateTime.Now;
}
private bool UserHasPermission(string permission)
{
// 调用权限服务(此处简化)
return true;
}
}
神来之笔:
痛点:审计记录像“天书”,审计员问“谁在何时改了什么?” → 你只能翻白眼!
解决方案:用 Serilog + Entity Framework,打造“时间机器”级审计!
// 代码3:审计日志记录(附注释)
public class AuditService
{
private readonly ILogger _logger;
public AuditService(ILogger logger)
{
_logger = logger;
}
public void LogAction(string action, string details)
{
_logger.Information(
EventId = new EventId(1001, "Audit"),
"Action: {Action}, Details: {Details}, User: {User}",
action, details, User.Identity.Name // 假设已登录用户
);
}
}
// 配置Serilog(输出到数据库)
public void ConfigureLogging()
{
Log.Logger = new LoggerConfiguration()
.WriteTo.MSSqlServer(
connectionString: "YourConnectionString",
tableName: "AuditLogs",
restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information
)
.CreateLogger();
}
审计黑科技:
痛点:报告像“天书”,管理层问“合规率多少?” → 你只能摇头!
解决方案:用 C# Linq + PDFSharp,生成“可视化合规报告”!
// 代码4:合规报告生成(附注释)
public class ComplianceReportGenerator
{
private readonly DbContext _dbContext;
public byte[] GenerateReport()
{
// 步骤1:查询合规数据(示例:近30天)
var complianceData = _dbContext.AuditLogs
.Where(l => l.Timestamp > DateTime.Now.AddDays(-30))
.GroupBy(l => l.Action)
.Select(g => new { Action = g.Key, Count = g.Count() })
.ToList();
// 步骤2:生成PDF(关键!)
var document = new Document();
var page = document.AddPage();
var gfx = XGraphics.FromPdfPage(page);
// 添加标题
gfx.DrawString("合规报告", FontSettings.GetFont(24), XBrushes.Black, new XRect(0, 0, page.Width, page.Height));
// 添加数据表格(此处简化)
// ...(代码略,完整版可私信获取)
return document.CreateReader().ReadToEnd();
}
}
报告亮点:
痛点:权限漏洞百出,实习生能删除核心数据?
解决方案:用 Policy-Based权限 + Aspect Oriented(AOP),实现“零信任防护”!
// 代码5:权限策略配置(附注释)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthorization(options =>
{
// 定义策略:必须是管理员且部门为“研发”
options.AddPolicy("AdminAndRnD", policy =>
policy.RequireRole("Admin")
.RequireClaim("Department", "R&D"));
});
}
}
// 使用策略(示例:删除产品API)
[Authorize(Policy = "AdminAndRnD")]
[HttpDelete("products/{id}")]
public IActionResult DeleteProduct(int id)
{
// 删除逻辑...
return Ok();
}
权限魔法: