【问题标题】:autofac multiple classes inherited from the same interfaceautofac 多个类继承自同一个接口
【发布时间】:2017-08-14 11:59:32
【问题描述】:

我正在使用 autofac 将我的依赖项注入到我的类中。其中几个类都实现了相同的接口。我是这样注册的

builder.RegisterType<PDFHedgeReport<object>>().As<IPDFReport<object>>().InstancePerDependency();
        builder.RegisterType<PDFRefVolReport<object>>().As<IPDFReport<object>>().InstancePerDependency();

然后在我的类构造函数中我有这个

public ReportGenerationService(IScheduleRepository scheduleRepository, 
        ExportEngine.PDF.IPDFReport<object> pdfHedgeReport,
        ExportEngine.PDF.IPDFReport<object> pdfRefVolReport,
        )
    {
        this._scheduleRepository = scheduleRepository;
        this._pdfHedgeReport = pdfHedgeReport;
        this._pdfRefVolReport = pdfRefVolReport;

    }

当代码运行时,访问了错误的类,代码即时测试的特定分支应该使用这个类

pdfHedgeReport

但它实际上使用的是这个 pdfRefVolReport

这是导致问题的代码行

var result = await this._pdfHedgeReport.GenerateReportForEmail(hedgeRequest, reportTitle, reportDescription, rpt);

它实际上不是被访问的 pdfHedgereport 类,它的 pdfRefVolReport

我是不是用 autofac 错误地注册了这些??

【问题讨论】:

    标签: c# interface autofac registration


    【解决方案1】:

    默认情况下会返回最后注册的类型,这就是你所看到的。

    您可能想查看如何注册不同类型的by key

    代码看起来像这样。

    注册:

    var builder = new ContainerBuilder();
    builder.RegisterType<PDFHedgeReport<object>>().Keyed<ExportEngine.PDF.IPDFReport<object>>("first");
    builder.RegisterType<PDFRefVolReport<object>>().Keyed<ExportEngine.PDF.IPDFReport<object>>("second");
    var container = builder.Build();
    

    一些构造函数:

    ctor(IIndex<string, ExportEngine.PDF.IPDFReport<object>> pdfHedgeReportCollection)
    {
        this.hedgeRefReport = pdfHedgeReportCollection["first"];
        this.refVolReport = pdfHedgeReportCollection["second"]
    }
    

    这就是我在使用 Autofac 时做这种事情的方式,而且效果很好。

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 2021-09-12
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      相关资源
      最近更新 更多