Можно ли получить тип контейнера в AutoFac - PullRequest
6 голосов
/ 23 января 2011

Например, я зарегистрировал класс 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 Ответ

7 голосов
/ 24 января 2011

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

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 это будет соответствовать только тем, у кого определенное имя.

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

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