我在我的应用程序中使用Ninject作为DI容器。为了松散地耦合到我的日志库,我使用的界面是这样的:使用Ninject填充Log4Net依赖项
public interface ILogger
{
void Debug(string message);
void Debug(string message, Exception exception);
void Debug(Exception exception);
void Info(string message);
...you get the idea
,我的实看起来像这样
public class Log4NetLogger : ILogger
{
private ILog _log;
public Log4NetLogger(ILog log)
{
_log = log;
}
public void Debug(string message)
{
_log.Debug(message);
}
... etc etc
样本类与日志记录依赖
public partial class HomeController
{
private ILogger _logger;
public HomeController(ILogger logger)
{
_logger = logger;
}
在实例化Log4Net的实例时,应该给它一个它将要记录的类的名称。这对Ninject来说是一个挑战。
的目标是,实例化的HomeController时,Ninject应该以一个“HomeController的”
这里的“名”实例ILog的是我的配置
public class LoggingModule : NinjectModule
{
public override void Load()
{
Bind<ILog>().ToMethod(x => LogManager.GetLogger(GetParentTypeName(x)))
.InSingletonScope();
Bind<ILogger>().To<Log4NetLogger>()
.InSingletonScope();
}
private string GetParentTypeName(IContext context)
{
return context.Request.ParentContext.Request.ParentContext.Request.Service.FullName;
}
}
然而,“姓名”,也就是被传递给ILog不是我所期待的。我无法找出任何韵律或理由,有时它是正确的,大部分时间不是这样。我看到的名字是OTHER类的名字,它们也依赖于ILogger。
当这是不对的,这是什么样子?你可以模拟一个阶级关系,这样你就可以提供一些假名称,至少可以解释你所看到的名字之间的关系吗?或者只是复制一些你的代码? –
我看到的名字是其他类的名字,它们依赖于'ILogger'。例如,在我的'HomeController'中,它得到一个名为'SomethingRepository'的记录器。 – Brook
实际上,我想你只是让我解决它。 ILog/ILogger不在正确的范围内。这是一个新的例子,然后重新使用它。他们应该是有限的瞬态。 – Brook