首页 > 解决方案 > 如何为 Autofac 创建的对象分配新值并传递给另一个注入对象的构造函数?

问题描述

我正在使用 Autofac 实现依赖注入。我无法使用传递给组件构造函数的对象的正确实例。

我的目的是让 Autofac 同时创建 ReportFileGenerator 和 ReportDefinition,然后在创建 ReportFileGenerator之前通过控制器中的 post 操作更改 ReportDefinition 的值,以便可以将更新后的值作为其参数传递。

我有一个ReportController

public class ReportController
{        
    private readonly IReportFileGenerator _reportFileGenerator;

    private IReportDefinition _reportDefinition;

    public ReportController(            
        IReportFileGenerator reportFileGenerator,
        IReportDefinition reportDefinition
    {
        _reportFileGenerator = reportFileGenerator;
        _reportDefinition = reportDefinition;
    }

(...)

    [HttpPost]
    public ActionResult Report(ReportViewModel viewModel)
    {            
        _reportDefinition = viewModel.ReportDefinition

        return _reportFileGenerator.GenerateReportFile();
    }
}

报告文件生成器

public class ReportFileGenerator : IReportFileGenerator
{
    private readonly IReportDefinition _reportDefinition;

    public ReportFileGenerator(
        IReportDefinition reportDefinition)
    {            
        _reportDefinition = reportDefinition
    }

    public FileContentResult GenerateReportFile()
    {
        [some logic to generate file result using reportDefinition] 
    }
}

最后是我的注册:

builder.RegisterType<ReportFileGenerator>()
   .As<IReportFileGenerator>()
   .InstancePerRequest();

builder.RegisterType<ReportDefinition>()
   .As<IReportDefinition>()
   .InstancePerRequest();

问题是传递给 ReportFileGenerator 的 ReportDefinition 没有在控制器操作中分配值(它只是一个具有默认值的全新实例)。

标签: c#dependency-injectionautofac

解决方案


查看当前的设计。似乎ReportDefinition应该用作显式依赖项IReportFileGenerator.GenerateReportFile()

public interface IReportFileGenerator {
    FileContentResult GenerateReportFile(ReportDefinition reportDefinition);
}

您似乎ReportDefinition更像是使用模型,而不是服务。我认为不需要通过构造函数注入它。

public class ReportFileGenerator : IReportFileGenerator {

    public FileContentResult GenerateReportFile(ReportDefinition reportDefinition) {
        //[some logic to generate file result using reportDefinition] 
    }
}

这将允许控制器IReportFileGenerator按预期调用

public class ReportController { 
    private readonly IReportFileGenerator reportFileGenerator;

    public ReportController( IReportFileGenerator reportFileGenerator) {
        this.reportFileGenerator = reportFileGenerator;
    }

    //(...)

    [HttpPost]
    public ActionResult Report(ReportViewModel viewModel) { 
        ReportDefinition reportDefinition = viewModel.ReportDefinition;    
        return reportFileGenerator.GenerateReportFile(reportDefinition);
    }
}

在您的原始设计中,您似乎误解了在这种情况下如何使用 DI。


推荐阅读