Это должно сделать это:
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
это будет соответствовать только тем, у кого определенное имя.
Пожалуйста, дайте мне знать, если это работает, другие спрашивали об этой же общей задаче, и с ней было бы хорошо поделиться.