Autofac разрешает названную службу неправильно - PullRequest
0 голосов
/ 13 декабря 2018

Я использую AutoFac для внедрения зависимостей, и у меня есть следующий код в файле global.asax.

builder.RegisterType<GenderMapper>()
    .As<ICodeMapper>().Named<ICodeMapper>(ValueSets.Gender.ToString());

builder.RegisterType<LanguageMapper>()
    .As<ICodeMapper>().Named<ICodeMapper>(ValueSets.Language.ToString());

builder.RegisterType<MaritalStatusMapper>()
    .As<ICodeMapper>().Named<ICodeMapper>(ValueSets.MaritalStatus.ToString());

builder.RegisterType<RelationshipMapper>()
    .As<ICodeMapper>().Named<ICodeMapper>(ValueSets.Relationship.ToString());

builder.Register<Antlr.Runtime.Misc.Func<string, ICodeMapper>>(c =>
{
    var componentContext = c.Resolve<IComponentContext>();
    return (roleName) =>
    {
        var codeMapper = componentContext.ResolveNamed<ICodeMapper>(roleName);
        return codeMapper;
    };
});

Где ValueSets - это перечисление.Я разрешаю службы следующим образом:

var codeMapper = _codeMapperFactory(mapperInstanceName);

Где _codeMapperFactory реализует ICodeMapper и является базовым абстрактным классом для 4 зарегистрированных картографов.

Проблема в том, что, что бызначение mapperInstanceName be, я всегда получаю маппер, зарегистрированный последним (т.е. RelationshipMapper).

Когда я отлаживаюсь, вызываемый конструктор имеет значение RelationshipMapper независимо от значения аргументапередан на завод.

В чем может быть причина этого?

1 Ответ

0 голосов
/ 15 декабря 2018

Здесь многое нужно распаковать, и может потребоваться некоторое обсуждение, потому что информации на самом деле недостаточно, но у меня мало времени, и я хотел бы получить ответ, чтобы помочь вам.Я могу или не смогу вернуться сюда, поэтому, если мой ответ не сработает, было бы лучше, если бы вы обновили свой вопрос с дополнительной информацией, а не комментировали и сидели и ждали меня.

Итак.

Я вижу, что вы зарегистрировали средства отображения и как неназванные и именованные реализации 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.Посмотрим, получится ли это когда-нибудь.(Мне не повезло, установка точек останова в этих сгенерированных функциях из функций. Вы также можете попробовать там установить точку останова.)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...