如何在.NET Core Web API中用Autofac实现带参DevExpress XtraReport取数
.NET Core Web API + DevExpress XtraReport + Autofac 依赖注入实现方案
1. 配置Autofac作为依赖注入容器
首先在Web API项目中替换默认DI容器为Autofac,注册领域服务和报表类型:
var builder = WebApplication.CreateBuilder(args); // 切换为Autofac服务提供器 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); builder.Host.ConfigureContainer<ContainerBuilder>(container => { // 注册领域服务(示例:IReportDataService 对应 ReportDataService) container.RegisterType<ReportDataService>().As<IReportDataService>().InstancePerLifetimeScope(); // 注册报表类型,支持带参数构造函数注入 container.RegisterType<CustomXtraReport>().InstancePerDependency(); }); // 其他Web API配置(比如AddControllers等) builder.Services.AddControllers(); var app = builder.Build(); // ... 中间件配置
2. 实现带依赖注入的自定义报表
创建继承自XtraReport的类,通过构造函数注入领域服务并接收报表参数,同时配置Object Data Source指向数据获取方法:
public class CustomXtraReport : XtraReport { private readonly IReportDataService _dataService; private readonly int _reportParamId; // 带参数的构造函数:注入领域服务 + 接收业务参数 public CustomXtraReport(IReportDataService dataService, int reportParamId) { _dataService = dataService; _reportParamId = reportParamId; // 初始化报表布局(可通过DevExpress设计器生成InitializeComponent方法) InitializeComponent(); // 配置Object Data Source var objectDS = new ObjectDataSource { DataSource = this, // 数据源指向当前报表实例 DataMember = nameof(GetReportData) // 指定数据获取方法名 }; this.DataSource = objectDS; } // 供Object Data Source调用的公开数据获取方法 public List<ReportDataDto> GetReportData() { // 调用注入的领域服务,结合参数获取报表数据 return _dataService.FetchReportData(_reportParamId); } }
注:如果是通过DevReportDesigner设计的报表,需确保设计器中Object Data Source的配置与代码一致,或直接通过代码覆盖配置。
3. Web API控制器中生成报表
在API控制器中,通过Autofac解析带参数的报表实例,生成并导出报表:
[ApiController] [Route("api/reports")] public class ReportController : ControllerBase { private readonly IComponentContext _componentContext; // 注入Autofac组件上下文,用于解析带参数的报表 public ReportController(IComponentContext componentContext) { _componentContext = componentContext; } [HttpGet("export-pdf")] public IActionResult ExportPdf(int paramId) { // 解析报表实例,传入构造函数参数 var report = _componentContext.Resolve<CustomXtraReport>( new NamedParameter("dataService", _componentContext.Resolve<IReportDataService>()), new NamedParameter("reportParamId", paramId) ); // 导出为PDF using var stream = new MemoryStream(); report.ExportToPdf(stream); stream.Position = 0; return File(stream, "application/pdf", $"Report_{paramId}.pdf"); } }
关键注意事项
- 报表注册时使用
InstancePerDependency,确保每个请求生成独立的报表实例,避免参数冲突。 - 领域服务的生命周期需与请求匹配(如
InstancePerLifetimeScope),保证数据上下文的正确性。 - Object Data Source指定的
DataMember必须是报表类中的公开无参方法,返回集合类型数据。
内容的提问来源于stack exchange,提问作者AdylshaY
相关产品推荐
相关产品推荐

