Как зарегистрировать IEnumerable‹IService› в контроллере DryIoc Mvc, таком как перечисление Autofac (IEnumerable‹B›, IList‹B›, ICollection‹B›)

Тестовый код с Autofac в порядке, но с DryIoc ошибка. Как заставить это работать.

public class HomeController : Controller
        {
            private readonly ITestAppService _testAppService;
            private readonly IEnumerable<ITestAppService> _testAppServiceList;
            public HomeController(ITestAppService testAppService, IEnumerable<ITestAppService> testAppServiceList)
            {
                _testAppService = testAppService;
                _testAppServiceList = testAppServiceList;
            }
    }
public class Test1AppService : ITestAppService{}
public class Test2AppService : ITestAppService{}
public interface ITestAppService: IAppService{}

Ошибка «Убедитесь, что контроллер имеет общедоступный конструктор без параметров» вызвана полем ITestAppService в контроллере, а не полем IEnumerable. Ниже приведен код моего регистра.

var impls =
                typeof(IAppService).Assembly
                .GetTypes()
                .Where(type =>
                type.IsPublic && 
                !type.IsAbstract && 
                type.GetInterfaces().Length != 0 && typeof(IAppService).IsAssignableFrom(type));

            foreach (var type in impls)
            {
                container.Register(type.GetInterfaces().First(), type, Reuse.Transient);

            }

Решено предложением Дадхи, Мой контейнер

DryIoc.IContainer container = new DryIoc.Container(
                rules =>
                {
                    return rules.WithFactorySelector(Rules.SelectLastRegisteredFactory())
                    .WithResolveIEnumerableAsLazyEnumerable();
                }
            );

Вики Dryioc об Разрешении из нескольких служб по умолчанию, возможно, нуждается в некотором обновлении. Rules.SelectLastRegisteredFactory — это метод.


person ShiTAoSome    schedule 01.08.2017    source источник
comment
Как вы регистрируете IAppTestService, что должно идти в одиночную зависимость, а что в коллекцию?   -  person dadhi    schedule 02.08.2017
comment
Проблема заключается в регистрации ITestAppService с двумя реализациями.   -  person ShiTAoSome    schedule 02.08.2017


Ответы (1)


Проблема в том, что при рассмотрении двух реализаций контейнера ITestAppService не знает, что выбрать для первой зависимости. Но вы можете явно определить соглашение:

var container = new Container(rules => rules
    .WithFactorySelector(Rules.SelectLastRegisteredFactory));
person dadhi    schedule 02.08.2017
comment
Большое спасибо, все отлично работает. Мой код такойDryIoc.IContainer container = new DryIoc.Container( rules => { return rules.WithFactorySelector(Rules.SelectLastRegisteredFactory()) .WithResolveIEnumerableAsLazyEnumerable(); } ); - person ShiTAoSome; 02.08.2017