如何为由Autofac创建的对象分配新值并传递给另一个注入的对象的构造函数?

时间:2019-03-24 09:28:43

标签: c# dependency-injection 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();
    }
}

ReportFileGenerator

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没有在控制器操作中分配值(这只是具有默认值的全新实例)。

1 个答案:

答案 0 :(得分:2)

查看当前设计。似乎应该将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。