C# 如何为Autofac创建的对象分配新值并传递给另一个注入对象的构造函数?
我正在用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
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的理解似乎存在误解。虽然我理解您的意图,但这是一个糟糕的设计,只会导致代码难以理解和维护。