Search code examples
c#.netinversion-of-controlcastle-windsor

Castle Windsor - Get Root Component type being resolved


I am using Castle Windsor IoC container and NLog in my project. I am trying to inject ILogger to classes where logging is needed. I want ILogger to be resolved to LogManager.GetLogger(RootTypeName).

Is there a way to get root type name? I tried following, but creationContext.RequestedType doesnt root type.

container.Register(Component.For<ILogger>()
    .UsingFactoryMethod((y, creationContext) =>
        LogManager.GetLogger(creationContext.RequestedType.FullName))
    .LifestyleTransient());

StructureMap has provision to do it

x.For<Logger>().Use(y => LogManager.GetLogger(y.RootType.FullName));

Solution

  • You can achieve this with subresolver...

    public class LoggerResolver : ISubDependencyResolver
    {
        public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
        {
            return dependency.TargetType == typeof(ILogger);
        }
    
        public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
        {
            return new LogManager.GetLogger(model.Implementation.FullName);
        }
    }
    

    than add into the kernel,

    Kernel.Resolver.AddSubResolver(new LoggerResolver())
    

    and drop your previous ILogger registration.