首页 > 解决方案 > Autofac:解析只有一个元素的列表失败

问题描述

一、案例:

注册:

var builder = new ContainerBuilder();

builder.RegisterType<ExportSchedule>()
       .As<ISchedule>()
       .InstancePerLifetimeScope();

builder.RegisterType<ImportReferenceDataSchedule>()
       .As<ISchedule>()
       .InstancePerLifetimeScope();

解析BaseconfigScheduleHandler类:

public BaseConfigScheduleHandler(List<ISchedule> schedules) {
    this.Schedules = schedules;
}

public List<ISchedule> Schedules { get; }

这种情况下工作正常。我得到了ISchedule的两个注册实例。

2.案例

我将注册更改为仅注册 1 个元素:

var builder = new ContainerBuilder();

builder.RegisterType<ExportSchedule>()
       .As<ISchedule>()
       .InstancePerLifetimeScope();

在这种情况下,依赖关系解析失败并出现以下异常:

Autofac.Core.DependencyResolutionException :在激活特定注册期间发生错误。有关详细信息,请参阅内部异常。注册:Activator = BaseConfigScheduleHandler (ReflectionActivator), Services = [docXtrans.TuevApi.Core.Data.Service.IScheduleHandler], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> 没有构造函数可以使用可用的服务和参数调用类型“docXtrans.TuevApi.Core.Data.Service.BaseConfigScheduleHandler”上的“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”:无法解析参数“System.Collections.Generic.List 1[ISchedule] schedules' of constructor 'Void .ctor(System.Collections.Generic.List1 [BaseConfigSchedule],System.Collections.Generic.List`1[ISchedule])'。

我需要这两种情况,并且希望在这个集合中拥有 1 个或多个元素。我该如何解决这个问题?

标签: c#autofac

解决方案


我建议使用一种受支持的枚举类型。根据文档

枚举(IEnumerable、IList、ICollection)

在您的情况下,这可能是:

IEnumerable<ISchedule> schedules

推荐阅读