Is it possible to get container type in AutoFac
For example, I have registered class C1 with one parameter in constructor of t开发者_开发知识库ype System.Type. I have another class (C2) with injected parameter of type C1. And I want receive typeof(C2) automatically in C1 constructor. Is it possible in some way?
Example code:
public class C1
{
  public C1(Type type) {}
  // ...
}
public class C2
{
  public C2(C1 c1) {}
  // ...
}
// Registration
containerBuilder.Register(???);
containerBuilder.Register<C2>();
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.
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论