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

C# 如何为Autofac创建的对象分配新值并传递给另一个注入对象的构造函数?,c#,dependency-injection,autofac,C#,Dependency Injection,Autofac,我正在用Autofac实现依赖注入。我无法使用传递到组件构造函数的对象的正确实例 public class ReportFileGenerator : IReportFileGenerator { public FileContentResult GenerateReportFile(ReportDefinition reportDefinition) { //[some logic to generate file result using reportDefinit

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

public class ReportFileGenerator : IReportFileGenerator {

    public FileContentResult GenerateReportFile(ReportDefinition reportDefinition) {
        //[some logic to generate file result using reportDefinition] 
    }
}
我的目的是让Autofac创建ReportFileGenerator和ReportDefinition,然后在创建ReportFileGenerator之前通过控制器中的post操作更改ReportDefinition的值,以便更新后的值可以作为其参数传递

我有一个报告控制器:

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();
builder.RegisterType()
.As()
.InstancePerRequest();
builder.RegisterType()
.As()
.InstancePerRequest();

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

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

您使用的
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。

@mjwills ReportDefinition只是一个具有某些自动属性的实体。我将研究生命周期范围,但是InstancePerLifetimeScope无法修复它。如果您能提供一个。请把所有的课程都包括在内,这样我们就可以在我们这边重做了。你有什么要求吗?Autofac应如何填充此对象?@KarolSkrobot在这种情况下,您对如何使用DI的理解似乎存在误解。虽然我理解您的意图,但这是一个糟糕的设计,只会导致代码难以理解和维护。