Решение перечислимых зависимостей Autofac без контравариантности

Для меня проблема в том, что я переношу свое приложение из более ранней версии Xcode, и в проекте отсутствует файл LaunchScreen.storyboard. Я только что создал LaunchScreen.storyboard и добавил его для запуска Screen File. Это сделал трюк.

1
задан Chris Fulstow 16 January 2019 в 03:11
поделиться

1 ответ

Слишком долго для комментария: я не могу дублировать поведение. Вот некоторые типы и модульный тест:

public interface ICommandHandler<T> where T : FooCommand { }
public class FooCommand { }
public class BarCommand : FooCommand { }
class FooCommandHandler : ICommandHandler<FooCommand> { }
class BarCommandHandler : ICommandHandler<BarCommand> { }
class BarCommandHandler2 : ICommandHandler<BarCommand> { }

[TestClass]
public class AutofacTests
{
    [TestMethod]
    public void ContainerResolvesExpectedDependency()
    {
        var container = GetContainer();
        var barCommandHandlers = container.Resolve<IEnumerable<ICommandHandler<BarCommand>>>()
            .ToArray();
        Assert.AreEqual(2, barCommandHandlers.Length);
        Assert.IsTrue(barCommandHandlers.Any(bch => bch is BarCommandHandler));
        Assert.IsTrue(barCommandHandlers.Any(bch => bch is BarCommandHandler2));
        Assert.IsFalse(barCommandHandlers.Any(bch => bch is FooCommandHandler));
    }

    private IContainer GetContainer()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<FooCommandHandler>().As<ICommandHandler<FooCommand>>();
        builder.RegisterType<BarCommandHandler>().As<ICommandHandler<BarCommand>>();
        builder.RegisterType<BarCommandHandler2>().As<ICommandHandler<BarCommand>>();
        return builder.Build();
    }
}

Я регистрирую различные реализации ICommandHandler<T>. Я включил дополнительный - BarCommandHandler2 - чтобы я мог убедиться, что я получаю коллекцию нескольких реализаций из контейнера.

Тесты пройдены. Я регистрирую все три типа, но когда я решаю IEnumerable<ICommandHandler<BarCommand>>, я получаю только две реализации, которые ожидаю.

Это имеет смысл, потому что FooCommandHandler не реализует ICommandHandler<BarCommand>. Если контейнер разрешит это, то это будет ошибка.

Я бы порекомендовал рассмотреть ту часть, в которой вы решаете IEnumerable<ICommandHandler<BarCommand>>. Возможно, у вас есть некоторые дополнительные генерики на работе, и во время выполнения вы на самом деле решаете что-то еще.

0
ответ дан Scott Hannen 16 January 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: