Files
XplorePlane/XP.ReportEngine/ReportEngineModule.cs
T
QI Mingxuan d72b583319 [XP.ReportEngine] 新增 TXT/CSV/Excel 三种报告输出格式支持;Excel (.xlsx) 报告生成器,基于 ClosedXML,支持结构化生成和模板填充两种模式; 新增 XplorePlane_ReportTemplate.xlsx:Excel 报告模板文件。
[XP.ReportEngine] 模型与配置扩展:ReportOutputFormat 枚举:新增 Excel=1, Csv=2, Txt=3(显式序号,向后兼容);新增多格式相关配置加载。
2026-07-01 11:31:41 +08:00

113 lines
6.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Prism.Ioc;
using Prism.Modularity;
using System.Resources;
using XP.Common.Localization;
using XP.Common.Localization.Interfaces;
using XP.Common.Logging.Interfaces;
using XP.ReportEngine.Configs;
using XP.ReportEngine.Interfaces;
using XP.ReportEngine.Services;
using XP.ReportEngine.ViewModels;
using XP.ReportEngine.Views;
namespace XP.ReportEngine
{
/// <summary>
/// 报告引擎模块 | Report Engine Module
/// Prism 模块入口,注册报告生成相关服务到 DI 容器
/// Prism module entry, registers report generation services to DI container
/// </summary>
[Module(ModuleName = "ReportEngineModule")]
public class ReportEngineModule : IModule
{
/// <summary>
/// 模块初始化 | Module initialization
/// 注册模块级多语言资源源 | Register module-level localization resource source
/// </summary>
public void OnInitialized(IContainerProvider containerProvider)
{
// 幂等注册代码页编码提供程序,使 GB2312/GBK 等代码页编码在 .NET 8 中可用(需求 5.3)
// Idempotently register the code page encoding provider so GB2312/GBK become available on .NET 8 (Requirement 5.3)
Services.EncodingResolver.EnsureCodePagesRegistered();
// 注册模块级多语言资源到 Fallback Chain | Register module-level localization resources to Fallback Chain
var localizationService = containerProvider.Resolve<ILocalizationService>();
var resourceManager = new ResourceManager(
"XP.ReportEngine.Resources.Resources",
typeof(ReportEngineModule).Assembly);
localizationService.RegisterResourceSource("XP.ReportEngine", resourceManager);
// 初始化 LocalizationHelper,使其通过 ILocalizationService 获取字符串(支持 Fallback Chain
// Initialize LocalizationHelper to use ILocalizationService for string lookup (supports Fallback Chain)
LocalizationHelper.Initialize(localizationService);
// 后台预热报告引擎(触发 iText7 初始化、字体加载、JIT 编译,避免首次生成卡顿)
// Background warm-up report engine (triggers iText7 init, font loading, JIT to avoid first-run latency)
var reportService = containerProvider.Resolve<IReportService>();
_ = System.Threading.Tasks.Task.Run(() => reportService.WarmUpAsync());
System.Console.WriteLine("[ReportEngineModule] 模块已初始化 | Module initialized");
}
/// <summary>
/// 注册类型到 DI 容器 | Register types to DI container
/// </summary>
public void RegisterTypes(IContainerRegistry containerRegistry)
{
// 注册配置加载器(瞬态)| Register config loader (transient)
containerRegistry.Register<Configs.ConfigLoader>();
// 加载并注册配置为单例 | Load and register config as singleton
containerRegistry.RegisterSingleton<ReportConfig>(container =>
{
var logger = container.Resolve<ILoggerService>();
var loader = new Configs.ConfigLoader(logger);
return loader.LoadReportConfig();
});
// 注册报告生成器(瞬态)| Register report generator (transient)
// 保留 IReportGenerator -> PdfReportGenerator,供工厂的 pdf 参数解析(需求 2.7)
// Keep IReportGenerator -> PdfReportGenerator so the factory's pdf param resolves (Requirement 2.7)
containerRegistry.Register<IReportGenerator, PdfReportGenerator>();
// 以具体类型注册 TXT/CSV/Excel 生成器(瞬态),供 ReportGeneratorFactory 构造函数分别解析
// 这些为同一程序集内的 internal sealed 类型,DryIoc 可在程序集内解析(需求 2.7)
// Register TXT/CSV/Excel generators as concrete types (transient) so the factory can resolve each.
// They are internal sealed types within the same assembly, resolvable by DryIoc (Requirement 2.7)
containerRegistry.Register<TxtReportGenerator>();
containerRegistry.Register<CsvReportGenerator>();
containerRegistry.Register<ExcelReportGenerator>();
// 注册报告生成器工厂(单例)| Register report generator factory (singleton)
containerRegistry.RegisterSingleton<IReportGeneratorFactory, ReportGeneratorFactory>();
// 注册报告服务门面(单例)| Register report service facade (singleton)
containerRegistry.RegisterSingleton<IReportService, ReportService>();
// 注册模板引擎(瞬态)| Register template engine (transient)
containerRegistry.Register<ITemplateEngine, JsonTemplateEngine>();
// 注册数据绑定器(瞬态)| Register data binder (transient)
containerRegistry.Register<IDataBinder, ExpressionDataBinder>();
// 注册排版引擎(瞬态)| Register layout engine (transient)
containerRegistry.Register<ILayoutEngine, PageLayoutEngine>();
// 注册 PDF 渲染器(瞬态)| Register PDF renderer (transient)
containerRegistry.Register<IPdfRenderer, ITextPdfRenderer>();
// 注册数据适配器(瞬态)| Register data adapter (transient)
containerRegistry.Register<IReportDataAdapter, ProcessorDataAdapter>();
// 注册报告编号生成器(单例,维护每日计数器状态)| Register report ID generator (singleton, maintains daily counter state)
containerRegistry.RegisterSingleton<ReportIdGenerator>();
// 注册演示窗口 ViewModel 和 View | Register demo window ViewModel and View
containerRegistry.Register<ReportDemoViewModel>();
containerRegistry.Register<ReportDemoWindow>();
System.Console.WriteLine("[ReportEngineModule] 类型注册完成 | Type registration completed");
}
}
}