Да, это работает (я только что изменил pi.DeclaringType на pi.Member.DeclaringType). Большое спасибо.

мер, я зарегистрировал класс C1 с одним параметром в конструкторе типаSystem.Type, У меня есть другой класс (C2) с введенным параметром типа C1. И я хочу получатьtypeof(C2) автоматически в конструкторе C1. Возможно ли это как-то?

Пример кода:

public class C1
{
  public C1(Type type) {}

  // ...
}

public class C2
{
  public C2(C1 c1) {}

  // ...
}

// Registration
containerBuilder.Register(???);
containerBuilder.Register<C2>();

Ответы на вопрос(1)

Решение Вопроса

Это должно сделать это:

builder.RegisterType<C1>();
builder.RegisterType<C2>();
builder.RegisterModule(new ExposeRequestorTypeModule());

Где:

class ExposeRequestorTypeModule : Autofac.Module
{
    Parameter _exposeRequestorTypeParameter = new ResolvedParameter(
       (pi, c) => c.IsRegistered(pi.ParameterType),
       (pi, c) => c.Resolve(
           pi.ParameterType,
           TypedParameter.From(pi.Member.DeclaringType)));

    protected override void AttachToComponentRegistration(
            IComponentRegistry registry,
            IComponentRegistration registration)
    {
        registration.Preparing += (s, e) => {
            e.Parameters = new[] { _exposeRequestorTypeParameter }
                .Concat(e.Parameters);
        };
    }
}

Любой компонент, который принимаетSystem.Type Параметр получит тип передаваемого ему запросчика (если есть). Возможным улучшением может быть использованиеNamedParameter скорее, чемTypedParameter ограничитьType параметры, которые будут соответствовать только тем, с определенным именем.

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

 Nicholas Blumhardt25 янв. 2011 г., 00:51
Ах, дох! - Спасибо за это. Я подумаю об альтернативах и опубликую их здесь, если найду.
 oryol10 июл. 2011 г., 19:48
Да, это работает (я только что изменил pi.DeclaringType на pi.Member.DeclaringType). Большое спасибо.
 Nicholas Blumhardt10 июл. 2011 г., 01:55
Привет, я обновил ответ, чтобы, надеюсь, решить проблему. Дайте мне знать, если вы можете попробовать.
 oryol24 янв. 2011 г., 20:04
Нет, к сожалению, это не работает. LimitType - это тип самого компонента (в данном случае C1)
 oryol30 янв. 2011 г., 00:44
Основная проблема в AutowiringParameter. Он всегда вызывает разрешение для детей без параметров (с пустым перечислимым). Я создал аналогичный параметр и зарегистрировал его в registration.ActivatorData.ConfiguredParameters (где ActivatorData - ReflectionActivatorData) со значением: registration.ActivatorData.ImplementationType. Но это работает только для явного c.Resolve <C2> (и с инъекцией самого C1 я получил «Не найдено конструкторов ...» для C1) ..

Ваш ответ на вопрос