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