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));
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.