c# - 如何为 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 没有在控制器操作中分配值(它只是一个具有默认值的全新实例)。
解决方案
查看当前的设计。似乎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。
推荐阅读
- javascript - 如何在进行多次更新时从具有嵌套对象的数组中提取元素 - MongoDB
- pandas - 从 Python 字典中拆分获取
- c - 如何使用链接器在 C 中运行可执行文件
- react-native - 方法 ViroARScene.getCameraOrientationAsync() 在旋转数组中返回奇怪的值
- python - 在 Kmeans++ 算法中选择最优质心
- reactjs - 如何在反应语音识别中设置默认输出消息?
- laravel - 将 nativescripte vue 应用程序连接到 localhost 服务器
- wix - WiX 工具集通过配置变量有条件地隐藏控制元素
- laravel - 试图获取非对象的属性“标头”(中间件角色身份验证)
- google-oauth - 将存储在 S3 存储桶中的凭据/.json 文件传递给 GoogleServiceAccountClient