Для меня проблема в том, что я переношу свое приложение из более ранней версии Xcode, и в проекте отсутствует файл LaunchScreen.storyboard. Я только что создал LaunchScreen.storyboard и добавил его для запуска Screen File. Это сделал трюк.
Слишком долго для комментария: я не могу дублировать поведение. Вот некоторые типы и модульный тест:
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>>
. Возможно, у вас есть некоторые дополнительные генерики на работе, и во время выполнения вы на самом деле решаете что-то еще.