Autofac: не удается разрешить списки с одним элементом - PullRequest
0 голосов
/ 11 апреля 2019

1. Корпус:

зарегистрирования:

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), Услуги = [docXtrans.TuevApi.Core.Data.Service.IScheduleHandler], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> Ни один из конструкторов не найден с 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' на тип 'docXtrans.TuevApi.Core.Data.Service.BaseConfigScheduleHandler' можно вызвать с помощью доступных служб и параметров: невозможно параметр разрешения «System.Collections.Generic.List 1[ISchedule] schedules' of constructor 'Void .ctor(System.Collections.Generic.List 1 [BaseConfigSchedule], System.Collections.Generic.List`1 [ISchedule]). (Подробности см. Во внутреннем исключении.)

Мне нужны оба случая и я хочу быть гибким, имея 1 или более элементов в этой коллекции. Как я могу решить эту проблему?

1 Ответ

1 голос
/ 11 апреля 2019

Я бы предложил использовать один из поддерживаемых типов перечисления. Согласно документам :

Перечисление (IEnumerable, IList, ICollection)

В вашем случае это может быть:

IEnumerable<ISchedule> schedules
...