Dpz.Core.Infrastructure

dpz.core 系统公共基础设施组件库。

版本: 1.0.1.0
目标框架: .NET 10.0

📋 主要特性

核心组件

  • 应用程序扩展: 提供应用初始化和配置扩展方法
  • 数据库工具: MongoDB 相关的默认配置和工具类
  • 异常处理: 业务异常、配置异常等自定义异常类型
  • 日期处理: 自定义日期类型和序列化支持
  • Excel 操作: 基于 ClosedXML/SpreadCheetah 的 Excel 导出功能
  • IP 限流: 完整的 IP 访问频率限制中间件
  • 请求拦截: 支持 UserAgent、IP、URI 等多维度的请求拦截规则
  • 对象存储: 又拍云对象存储操作封装
  • 日志集成: Seq 日志中心配置类
  • 文件处理: TagLib 音频文件信息读取支持

🔧 技术栈

  • .NET: 10.0
  • MongoDB: MongoDB.Driver 3.7.0
  • Excel: ClosedXML 0.105.0 / SpreadCheetah 1.27.0
  • Markdown: Markdig 1.1.1
  • HTML 解析: AngleSharp 1.4.0
  • 序列化: MessagePack.Annotations 3.1.4
  • 日志: Serilog 4.3.1

💡 使用示例

IP 限流中间件

配置示例

{
  "RateLimit": {
    "EnableRateLimiting": true,
    "DefaultRequestsPerMinute": 60,
    "WhitelistedIps": ["127.0.0.1", "::1"]
  }
}

注册服务

// 注册 IP 限流服务
services.AddSingleton<IpRateLimitService>();

// 添加中间件
app.UseMiddleware<RateLimitMiddleware>();

请求拦截规则

配置示例

{
  "InterceptRules": [
    { "Type": "UserAgent", "Pattern": "*bot*" },
    { "Type": "ClientIp", "Pattern": "192.168.1.*" },
    { "Type": "Uri", "Pattern": "/admin/*" }
  ]
}

使用方法

services.AddScoped<IInterceptRuleService, InterceptRuleService>();

// 在中间件中使用
var shouldIntercept = interceptRuleService.ShouldIntercept(context);

业务异常处理

// 抛出业务异常
throw new BusinessException("业务逻辑错误信息");

// 抛出配置异常
throw new InvalidConfigurationException("配置错误信息");

// 抛出已存在异常
throw new ExistsException("资源已存在");

Excel 导出

使用 ExportMarkAttribute 标记需要导出的属性:

public class ExportModel
{
    [ExportMark("姓名")]
    public string Name { get; set; }
    
    [ExportMark("年龄")]
    public int Age { get; set; }
}

推荐直接写入目标 Stream,避免大文件导出时生成 byte[] 带来的整文件内存占用和 额外复制:

await data.WriteForMarkAsync(response.Body, "导出结果", cancellationToken: cancellationToken);

需要完整样式和自定义工作表处理时使用默认的 ClosedXML 路径:

data.WriteForMark(stream, "导出结果", action: worksheet =>
{
    worksheet.Cell(1, 1).SetValue("自定义标题");
});

几十万行等大数据导出优先使用 SpreadCheetah 流式路径:

await data.WriteForMarkStreamingAsync(
    response.Body,
    "导出结果",
    cancellationToken: cancellationToken
);

ExportForMark/ExportMultipleForMark 仍保留为小文件便捷 API。大文件或 Web 响应场景 不建议直接返回 byte[],应直接写入响应流、对象存储流或调用方提供的流。

📦 安装

NuGet 包

dotnet add package Dpz.Core.Infrastructure

项目引用

<ItemGroup>
  <ProjectReference Include="..\Dpz.Core.Infrastructure\Dpz.Core.Infrastructure.csproj" />
</ItemGroup>

📚 组件说明

Date 类型

自定义的日期类型,支持 MongoDB 序列化:

public class Entity
{
    public Date BirthDate { get; set; }
}

UpyunOperator

又拍云对象存储操作封装:

var upyun = new UpyunOperator(bucketName, operatorName, password);
// 上传、下载、删除等操作

LogSeq

Seq 日志中心配置:

{
  "LogSeq": {
    "ServerUrl": "https://logs.dpangzi.com",
    "ApiKey": "your-api-key"
  }
}

⚠️ 注意事项

  1. 限流中间件: 需要配合 Redis 或内存缓存使用
  2. 拦截规则: 支持通配符匹配,使用 * 作为通配符

🔗 相关文档

📄 许可证

Copyright © dpangzi

🔄 更新日志

1.0.1.0

  • 升级至 .NET 10.0
  • 更新所有依赖包至最新版本
  • 完善 IP 限流功能
  • 添加请求拦截规则支持

历史更新

2019年12月18日:新增 ViewModel 自动化查询

  • 实现 IMapFrom<TEntity> 接口的 ViewModel
  • 根据特性 ViewModelLabelAttribute 标识查询字段
  • 已实现操作符:EqualNotEqual、String 类型的 Contains
评论加载中...