我使用Log4net进行日志记录,并且我有很多具有ILog依赖关系的对象。这些依赖项与其他依赖项一样注入。我想坚持使用Log4net记录器命名约定,因此注入实例的记录器以实例的类型命名。我一直在使用ILog的以下绑定:
Bind<ILog>().ToMethod(ctx =>
LogManager.GetLogger(ctx.Request.ParentRequest == null ? typeof(object) : ctx.Request.ParentRequest.Service)
);
这违反了命名约定,因为记录器将以接口而非实现类型命名。
interface IMagic {}
class Magic: IMagic
{
ILog logger; // The logger injected here should have the name "Magic" instead of IMagic
}
我尝试了几种方法从ctx获取实现类型但没有成功。有没有办法获得实现类型?
答案 0 :(得分:2)
this和that涵盖了您的问题,但它们并不完全重复,因此我会重新发布此信息:
Bind<ILog>().ToMethod(context =>
LogManager.GetLogger(context.Request.ParentContext.Plan.Type));
所以context.Request.ParentContext.Plan.Type
是注入的ILog
类型。如果你想要IResolutionRoot.Get<ILog>()
,那么就不会有注入ILog
的类型,因此也不会成为ParentContext
。在这种情况下,您需要按照之前的解决方案进行null
检查:
Bind<ILog>().ToMethod(context =>
LogManager.GetLogger(context.Request.ParentContext == null ?
typeof(object) :
context.Request.ParentContext.Plan.Type));