Разрешение по имени типа (или идентификатору, IComponentRegistration ...) в Autofac - PullRequest
1 голос
/ 03 января 2012

У меня несколько (универсальных) типов, зарегистрированных в Autofac, все они "реализуют" (универсальный) интерфейс маркеров.По сути, это регистрация, и я не могу изменить ее (например, по имени):

builder.RegisterGeneric(typeof(MyType1<>)).As(typeof(IMarkerInterface<>));
builder.RegisterGeneric(typeof(MyType2<>)).As(typeof(IMarkerInterface<>));
builder.RegisterGeneric(typeof(MyType3<>)).As(typeof(IMarkerInterface<>));

, где builder - это экземпляр ContainerBuilder. Существует ли правильный способ разрешения типа, зарегистрированного как IMarkerInterface <>, если я знаю только имя реализации (типа) (например, MyAssembly.MyType2)? Регистрация может быть просто выбрана из IComponentContext.ComponentRegistry.Registrations с помощьюLINQ-запрос, поэтому, в конце концов, у меня также есть объект регистрации, я просто не могу его активировать:

  • registration.Activator.ActivateInstance () нужны параметры конструктора, но я не знаюони (хотя они могут быть введены Autofac, если разрешены)
  • Там раньше был метод , полностью подходящий для меня (так как у меня есть идентификатор регистрации и экземпляр ICompontentContext), но, похоже,что сейчас (v2.5.2.830) его уже нет.
  • Поскольку тип службы типа является интерфейсом маркера, я не могу разрешить по типу службы, поскольку это разрешило бы одну реализацию, которая оказывается включеннойtop.

Обходным путем было бы, я думаю, пометить типы интерфейсом, производным от IMarkerInterface <>поэтому у них всех тоже будут уникальные услуги.Другой вариант - разрешить IEnumerable>, но это разрешит все реализации, а не только ту, которая необходима (хотя это оказывает незначительное влияние на производительность, но все же излишне).Но я не знаю, является ли это лучшим решением, я чувствую, что должен быть более простой способ.

Любая помощь будет принята с благодарностью!

Решение

Поскольку я пока не могу ответить, вот здесь: просто имитируя реализацию Autofac.ResolutionExtensions, которая была когда-то, этот код работает (и я, честно говоря, не знаю почему: параметры конструктора заполняются правильно; это должно означать, что янеправильно понял, что такое аргумент «параметры»).

registration.Activator.ActivateInstance(_componentContext, Enumerable.Empty<Parameter>());

где регистрация - это экземпляр IComponentRegistration, соответствующий реализации, которую я хотел создать.По-видимому, для этого также необходимо что-то «инициализировать» контейнер с текущими типами params.Достаточно позвонить на номер

_componentContext.IsRegistered<IMarkerInterface<TypeParameter>>()

.

Спасибо Себастьену Веберу и Квалканти за входные данные!

1 Ответ

0 голосов
/ 03 января 2012

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

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