autofac从同一接口继承的多个类

时间:2017-08-14 11:59:33

标签: c# interface autofac registration

我使用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;

    }

当代码运行时,正在访问错误的类,代码im测试的特定分支应该使用此类

pdfHedgeReport

但它实际上使用了这个pdfRefVolReport

这是导致问题的代码行

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

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

所以我用autofac注册了这些错误的方法吗?

1 个答案:

答案 0 :(得分: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时做这种事情的方法,而且效果很好。