You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:32:42