Здесь многое нужно распаковать, и может потребоваться некоторое обсуждение, потому что информации на самом деле недостаточно, но у меня мало времени, и я хотел бы получить ответ, чтобы помочь вам.Я могу или не смогу вернуться сюда, поэтому, если мой ответ не сработает, было бы лучше, если бы вы обновили свой вопрос с дополнительной информацией, а не комментировали и сидели и ждали меня.
Итак.
Я вижу, что вы зарегистрировали средства отображения и как неназванные и именованные реализации ICodeMapper
.Я также вижу, что RelationshipMapper
является последним, что означает, что если вы разрешите неназванную реализацию , то именно ту, которую вы получите.
// You'd get RelationshipMapper
container.Resolve<ICodeMapper>();
Я также вижу, что естьAntlr.Runtime.Misc.Func<string, ICodeMapper>
регистрируется.Я не знаю, что это за тип, но я вижу, что он может конфликтовать с System.Func<string, ICodeMapper>
.
Autofac обрабатывает System.Func
, так что если он вызывается, вы получите безымянный экземпляр.
// You'd get RelationshipMapper
var f = container.Resolve<Func<ICodeMapper>>();
f();
Вот что я бы проверил:
- Убедитесь, что вы можете вручную разрешить именованные сопоставители, просто чтобы убедиться, что это работает.
- Убедитесь, что вы разрешаете Antlr
Func
, а не System.Func
. - Попробуйте удалить
As<ICodeMapper>
и используйте Named<ICodeMapper>
, только если вы не разрешаете никакие безымянные типы.Вы можете начать получать исключение, и это может помочь вам в дальнейшем устранении неполадок.Например, если Autofac выдает исключение о том, что ICodeMapper
не зарегистрирован, вы будете знать, что он не разрешает именованные вещи, он пытается разрешить неназванные вещи. - Броситьисключение из вашего Antlr
Func
вместо вызова componentContext.ResolveNamed
.Посмотрим, получится ли это когда-нибудь.(Мне не повезло, установка точек останова в этих сгенерированных функциях из функций. Вы также можете попробовать там установить точку останова.)
Надеюсь, это поможет.