For example, I have registered class C1 with one parameter in constructor of type System.Type
. I have another class (C2) with injected parameter of type C1. And I w
This should do it:
builder.RegisterType<C1>();
builder.RegisterType<C2>();
builder.RegisterModule(new ExposeRequestorTypeModule());
Where:
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);
};
}
}
Any component that takes a System.Type
parameter will get the type of the requestor passed to it (if any.) A possible improvement might be to use a NamedParameter
rather than TypedParameter
to restrict the Type
parameters that will be matched to only those with a certain name.
Please let me know if this works, others have asked about the same general task and this would be good to share with them.